DCSIMG
Validation Application Block with Strippers: DateTimeRangeValidator (Overview of all VAB Validators) - Justin myJustin = new Justin( Expriences.Current );

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.

        private DateTime _visitDate;

 

        public DateTime VisitDate

        {

            get { return _visitDate; }

            set { _visitDate = value; }

        }

נרצה שלא ניתן יהיה לדווח על תאריך שמאוחר מה-1.1.2010.
נשתמש ב-DateTimeRangeValidator כדי לבצע את הוולידציה.

DateTimeRangeValidator הוא RangeValidator בתחפושת.

image_thumb25_thumb1

כן, גם היא מחופשת.

אם אתם זוכרים RangeValidator מאפשר לנו לפרט טווח תאריכי שבו נוכל לפרט בדיקה.

image_thumb26_thumb1

בואו נראה איך נראה ה-DateTimeRangeValidatorAttribute.

image_thumb27_thumb1

וכאן עומד ההבדל.

ההבדל הוא אחד פשוט ומעניין מאוד - אי-אפשר באמת להשתמש ב-RangeValidator לוולידציה על DateTime.
נניח שהיינו מנסים:

image_thumb28_thumb1

ההסבר הטכני: היות והמאפיינים שנשלחים לקונסטרקטור של Attributes חייבים להיות Constant ואי-אפשר בדוט נט ליצור const DateTime, אין באמת אפשרות לשלוח ל-Attribute בתוך הקונסטרקטור טיפוס מסוג DateTime.

הפירוש הטכני: חייבים לעבוד עם DateTimeRangeValidator אם רוצים לבדוק מאפיין מול ערך תאריכי קבוע כלשהו.

והיות וכרגע אמרנו שאי-אפשר להשתמש ב-DateTime ב-Attributes, נפרט את התאריכים בפורמט כמחרוזת (ובסופו של דבר הם יעברו Parsing ל-DateTime).

        private DateTime _visitDate;

        [DateTimeRangeValidator("2010-01-01T00:00:00",

                                MessageTemplate="Visit date has to be before 1/1/2010")]

        public DateTime VisitDate

        {

            get { return _visitDate; }

            set { _visitDate = value; }

        }

שימו לב ששלחנו מחרוזת לתוך DateTimeRangeValidator כגבול עליון וזו תעבור Parsing ותהפוך ל-DateTime.

ועכשיו נשאלת השאלה - מה זה הפורמט המזעזע הזה שאנחנו נתנו פרמטרים בו? מסתבר שצריך לשלוח ל-DateTimeRangeValidator תאריך ושעה באיזה פורמט מוזר של ISO. התבנית יחסית פשוטה.

Year-Month-Day"T"Hour:Minute:Second

למה דווקא בחרו בפורמט הזה? שאלה נהדרת. כנראה מאוד בגלל שהצורה שלו קבועה ולא משתנה בין תרבויות. הרי, אנחנו היינו שמחים לרשום 30/1/2007, אבל יש לזה משמעות שונה לחלוטין בתרבויות שבהן התאריך נכתב בצורה שונה (למשל, בארה"ב התאריך הזה מתייחס ליום הראשון בחודש ה-30 בשנת 2007). אז כדי למנוע את הבלבול הזה, עובדים עם הפורמט ה-ISOי הזה.

נראה איך נוסיף את ה-DateTimeRangeValidator הזה דרך כלי הקונפיוגרציה הגרפי.

image_thumb29_thumb1

ונקבע לו את שתי המאפיינים הרלוונטיים:

image_thumb30_thumb1

והקונפיוגרציית XML שנקבל מזה בקובץ BL.config תהיה:

          <property name="VisitDate">

            <validator lowerBound="" lowerBoundType="Ignore" upperBound="2010-01-01"

              upperBoundType="Inclusive" negated="false" messageTemplate="Visit date has to be before 1/1/2010"

              messageTemplateResourceName="" messageTemplateResourceType=""

              tag="" type="Microsoft.Practices.EnterpriseLibrary.Validation.Validators.DateTimeRangeValidator, Microsoft.Practices.EnterpriseLibrary.Validation, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"

              name="Date Range Validator" />

          </property>

שימו לב אגב שדרך העורך הגרפי כן ניתן לרשום תאריך בצורה נורמטיבית, אבל צריך להיזהר עם זה מהסיבות שציינו.

נראה אם באמת ב-GUI הנתונים עוברים וולידציה כמו שצריך:

image_thumb31_thumb1

image_thumb32_thumb1

שימו לב בבקשה שהשתמשנו בשני סוגים שונים לחלוטין של פירוט תאריכים. פעם כתבנו ה-1/1/2011 ופעם השנייה 12:30 13.2.2012 ועדיין הפריימוורק ידע איך לטפל במחרוזות האלו שמגיעות מתרבויות שונות לחלוטין, לפרמט אותן לתאריך ובצע עליהן וולידיה.

אז כמו שאמרנו, הסיבה לשימוש ב-DateTimeRangeValidator היא שכאשר יש לנו תאריך קבוע שנרצה לכתוב בקובץ קונפיוגרציה או ב-Attribute, לא נוכל לעשות את זה ב-RangeValidator רגיל.

Comments

No Comments