Validation Application Block with Strippers: DateTimeRangeValidator (Overview of all VAB Validators)

סדרת לומדים Validation Application Block עם חשפניות
1. קדם דבר: למה צריך וולידציה? (או: "קופים. פשוט קופים."), פורסם ב-26.6.2007
2. חלק ראשון: הפתרון הקיים והמצוי ב-Winforms, Console ו-ASP.Net (או: "איך קוראים לך ובת כמה את?"), פורסם ב-8.7.2007
3. חלק שני: שימוש ישיר ב-Validatorים של VAB (או: "איך לגרום לקוד יחסית קריא להפוך להיות ארוך ומעיק"), פורסם ב-9.7.2007
4. חלק שלישי: הכנסת נתוני הוולידטורים לתוך מחלקות (או: "ממלכתי עבור וולידטור ג'נארי"), פורסם ב-10.7.2007
5. חלק רביעי: אינטגרציה בסיסית עם ה-GUI ו-וולידציה מתוך קבצי קונפיוגרציה (או: "קצת יותר Drag&Drop, קצת פחות קוד"), פורסם ב-11.7.2007
6. חלק רביעי המשך: אינטגרציה בסיסית עם ה-GUI ו-וולידציה מתוך קבצי קונפיוגרציה (או: "קצת יותר Drag&Drop, קצת פחות קוד"), פורסם ב-12.7.2007
7. StringLengthValidator - בודקים שהכניסו שם חשפנית, פורסם ב-15.7.2007
8. RangeValidator - נו, תן ציון ל-Lap dance שקיבלת, פורסם ב-16.7.2007
9. DateTimeRangeValidator - מתי ביקרת אצלנו?, פורסם ב-17.7.2007
10. ContainsCharctersValidator ו-Negated - איך קוראים לך?, יפורסם ב-18.7.2007
11. RelativeDateTimeValidator - מתי היום-הולדת שלך?, יפורסם ב-19.7.2007
12. PropertyComparisonValidator ושני וולידטורים על אותו מאפיין - נבדוק שהמבקר נולד לפני שהוא ביקר במועדון, יפורסם ב-22.7.2007
13. RegexValidator - בודקים את הדוא"ל של המבקר , יפורסם ב-23.7.2007
14. DomainValidator - מה הסוג משקה אלכוהולי האהוב עלייך?, יפורסם ב-24.7.2007
15. ObjectValidator - מה המספר פלאפון שלך?, יפורסם ב-25.7.2007
16. ObjectCollectionValidator - מה המספרי פלאפון של החברים שלך?, יפורסם ב-26.7.2007
DateTimeRangeValidator - מתי ביקרת אצלנו?
אחרי שאמרנו מי הייתה החשפנית שלנו ושיבחנו את כישורי הריקוד האקזוטי שלה, נרצה שיגידו לנו הלקוח ביקר אצלנו.
חס וחלילה, למקרה שהוא נתן ביקורת שלילית נוכל לדעת זה כי החשפנית לא הרגישה טוב באותו היום.
נוסיף מאפיין בשם VisitDate.
נרצה שלא ניתן יהיה לדווח על תאריך שמאוחר מה-1.1.2010.
נשתמש ב-DateTimeRangeValidator כדי לבצע את הוולידציה.
DateTimeRangeValidator הוא RangeValidator בתחפושת.
כן, גם היא מחופשת.
אם אתם זוכרים RangeValidator מאפשר לנו לפרט טווח תאריכי שבו נוכל לפרט בדיקה.
בואו נראה איך נראה ה-DateTimeRangeValidatorAttribute.
וכאן עומד ההבדל.
ההבדל הוא אחד פשוט ומעניין מאוד - אי-אפשר באמת להשתמש ב-RangeValidator לוולידציה על DateTime.
נניח שהיינו מנסים:
ההסבר הטכני: היות והמאפיינים שנשלחים לקונסטרקטור של Attributes חייבים להיות Constant ואי-אפשר בדוט נט ליצור const DateTime, אין באמת אפשרות לשלוח ל-Attribute בתוך הקונסטרקטור טיפוס מסוג DateTime.
הפירוש הטכני: חייבים לעבוד עם DateTimeRangeValidator אם רוצים לבדוק מאפיין מול ערך תאריכי קבוע כלשהו.
והיות וכרגע אמרנו שאי-אפשר להשתמש ב-DateTime ב-Attributes, נפרט את התאריכים בפורמט כמחרוזת (ובסופו של דבר הם יעברו Parsing ל-DateTime).
שימו לב ששלחנו מחרוזת לתוך DateTimeRangeValidator כגבול עליון וזו תעבור Parsing ותהפוך ל-DateTime.
ועכשיו נשאלת השאלה - מה זה הפורמט המזעזע הזה שאנחנו נתנו פרמטרים בו? מסתבר שצריך לשלוח ל-DateTimeRangeValidator תאריך ושעה באיזה פורמט מוזר של ISO. התבנית יחסית פשוטה.
Year-Month-Day"T"Hour:Minute:Second
למה דווקא בחרו בפורמט הזה? שאלה נהדרת. כנראה מאוד בגלל שהצורה שלו קבועה ולא משתנה בין תרבויות. הרי, אנחנו היינו שמחים לרשום 30/1/2007, אבל יש לזה משמעות שונה לחלוטין בתרבויות שבהן התאריך נכתב בצורה שונה (למשל, בארה"ב התאריך הזה מתייחס ליום הראשון בחודש ה-30 בשנת 2007). אז כדי למנוע את הבלבול הזה, עובדים עם הפורמט ה-ISOי הזה.
נראה איך נוסיף את ה-DateTimeRangeValidator הזה דרך כלי הקונפיוגרציה הגרפי.
ונקבע לו את שתי המאפיינים הרלוונטיים:
והקונפיוגרציית XML שנקבל מזה בקובץ BL.config תהיה:
שימו לב אגב שדרך העורך הגרפי כן ניתן לרשום תאריך בצורה נורמטיבית, אבל צריך להיזהר עם זה מהסיבות שציינו.
נראה אם באמת ב-GUI הנתונים עוברים וולידציה כמו שצריך:
שימו לב בבקשה שהשתמשנו בשני סוגים שונים לחלוטין של פירוט תאריכים. פעם כתבנו ה-1/1/2011 ופעם השנייה 12:30 13.2.2012 ועדיין הפריימוורק ידע איך לטפל במחרוזות האלו שמגיעות מתרבויות שונות לחלוטין, לפרמט אותן לתאריך ובצע עליהן וולידיה.
אז כמו שאמרנו, הסיבה לשימוש ב-DateTimeRangeValidator היא שכאשר יש לנו תאריך קבוע שנרצה לכתוב בקובץ קונפיוגרציה או ב-Attribute, לא נוכל לעשות את זה ב-RangeValidator רגיל.