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

Validation Application Block with Strippers: ContainsCharctersValidator and Negated (Overview of all VAB Validators

image

סדרת לומדים 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

 

 

ContainsCharctersValidator ו-Negated - איך קוראים לך?

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

        private string _customerName;

 

        public string CustomerName

        {

            get { return _customerName; }

            set { _customerName = value; }

        }

נשתמש ב-ContainsCharcterValidator כדי לבדוק את האותיות בשם הלקוח.

        private string _customerName;

        [ContainsCharactersValidator("אבגדהוזחטיכלמסעפצקרשת",

                               MessageTemplate="Customer name cannot be in hebrew")]

        public string CustomerName

        {

            get { return _customerName; }

            set { _customerName = value; }

        }

נרחיב את ההגדרה לרגע (למרות שהקוד הזה מספיק ורץ כמו טאטאלה) שיכיל ContainsCharcters.

        private string _customerName;

        [ContainsCharactersValidator("אבגדהוזחטיכלמסעפצקרשת", ContainsCharacters.Any,

                               MessageTemplate="Customer name cannot be in hebrew")]

        public string CustomerName

        {

            get { return _customerName; }

            set { _customerName = value; }

        }

המאפיין ContainsCharcters מפנה ל-Enum בעל אחד משתי אפשרויות: ContainsCharcters.Any ו-ContainsCharcters.All.

ContainsCharcters.Any הוא הברירת מחדל ומגדיר שהלוגיקה של הוולידטור הוא לחפש שהשם מכיל לפחות תו אחד מהתווים שסיפקנו.
ContainsCharacters.All משנה את הלוגיקה של הוולידטור שהמחרוזת חייבת להכיל את כל האותיות שסיפקנו.

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

        private string _customerName;

        [ContainsCharactersValidator("אבגדהוזחטיכלמסעפצקרשת", ContainsCharacters.Any,

                                        Negated=true,

                                        MessageTemplate="Customer name cannot be in hebrew")]

        public string CustomerName

        {

            get { return _customerName; }

            set { _customerName = value; }

        }

המאפיין Negated נמצא בכל וולידטור ומאפשר להפוך את הלוגיקה של הוולידטור.
כלומר, אם כאשר Negated=false הוולידציה מחפשת "לפחות אות א"ב אחת בשם הלקוח" עכשיו היא תחפש שלא יהיה "לפחות אות א"ב אחת בשם הלקוח".

נוכל לקבוע לכל וולידטור באשר הוא שהוא Negated ובכך להפוך את הלוגיקה שלו.

נראה איך היינו מוסיפים את הוולידטור דרך כלי הקונפיגיורציה ב-GUI.

image_thumb33_thumb1 

image_thumb34_thumb1

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

          <property name="CustomerName">

            <validator characterSet="אבגדהוזחטיכלמסעפצקרשת" containsCharacter="Any"

              negated="true" messageTemplate="Customer name cannot be in hebrew"

              messageTemplateResourceName="" messageTemplateResourceType=""

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

              name="Contains Characters Validator" />

          </property>

נבדוק ב-GUI שבאמת לא ניתן להזין אותיות בעברית.

image_thumb35_thumb1

image_thumb37_thumb1

למעשה בדוגמה הזו הפכנו לחלוטין את הלוגיקה של הוולידציה שהגיעה כברירת מחדל עם VAB.

 

נראה דוגמה מתוך ה-Unit tests לשימוש ב-ContainsCharcterValidator עם ContainsCharcters.All שהוא negated=false.

        [TestMethod]

        public void NonNegatedWithAllCharactersAcceptsStringWithAllCharacters()

        {

            ContainsCharactersValidator validator = new ContainsCharactersValidator("abc", ContainsCharacters.All, false);

 

            ValidationResults results = validator.Validate("asdfbc");

 

            Assert.IsTrue(results.IsValid);

        }

בשורה הראשונה יצרנו ContainsCharctersValidator שבודק אם מחרוזת מכילה בתוכה את האותיות b, c ו-a. כלומר, את כל שלושתן.

בשורה הבאה אנחנו בודקים את "asdfbc".

בשורה האחרונה אנחנו רואים ש-IsValid=true. כלומר, אכן "asdfbc" מכיל את שלושת האותיות "abc".

Comments

No Comments