
data annotation לא בודק את מה שאתם צריכים, אפשר לבנות attribute משלכם. הדוגמה כאן: איסור על שני רווחים רצופים בטקסט.ExtraSpacingForbiddenAttribute שיורשת מ-ValidationAttribute, כמו כל ה-validators הקיימים. אפשר לשים אותה בתיקיית המודלים, או בתיקייה נפרדת. המילה Attribute בסוף אופציונלית בשימוש.IsValid: בוחרים בגרסה שמקבלת גם את ה-value וגם ValidationContext. ה-value הוא מה שמנסים להכניס למאפיין שמעליו ה-validator.null מחזירים ValidationResult.Success. ה-validator הזה אינו required, ואם title אינו שדה חובה, אסור שה-validator יכשיל כשלא הוזן ערך. לכן המאפיין מוגדר string?.value.ToString() (עם סימן קריאה כי null כבר טופל), ואז בודקים אם הטקסט Contains שני רווחים (או יותר).ValidationResult עם השם של המאפיין מ-validationContext.MemberName, והטקסט "contains multiple space sequence". אחרת מחזירים Success.[ExtraSpacingForbidden] מעל title ומעל description.הטקסט המלא של הדקות הראשונות בהרצאה «יצירת מאפיין וולידציה Custom Validator» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
כל ה-attributes האלה שראינו זה בעצם attributes שקיימים ב-data annotation namespace וכל אחד בודק משהו ספציפי required בודק שאכן יש לנו כאן ערך maximum length בודק שהערך הזה לא ארוך מדי לפי מה שהגדרנו כאן.
אבל מה קורה אם אנחנו רוצים לבצע איזושהי בדיקה שבאמת לא קיימת ואני לא יכול להשיג אותה בשום אפשרות אחרת? ואני רוצה לעשות לבדוק ש-title או ש-description יש להם איזה משהו ספציפי ואין לי את המענה מה-attributes הקיימים.
אז מה שאפשר לעשות זה custom attribute משלנו, שאחר כך אנחנו משתמשים איתו כאילו שהוא attribute רגיל במערכת. בואו נבנה לעצמנו אחד כזה. בואו נלך רגע לרשימת המודלים.
אפשר כמובן לשים אותו באיזו תיקייה משלו של errors אולי, או validations או משהו כזה, אבל בגלל שאין לנו פה כל כך הרבה תיקיות זה בסדר, פשוט לשים אותו כרגע במודל. אז בואו נפתח מחלקה חדשה, נגדיר מחלקה חדשה ונבנה valiדator שנקרא extraSpacingForbidden Attribute, כי זה מחלקת attribute.
אפשר גם בלי המילה attribute זה אותו הדבר. בואו ניפטר מהזנב הזה, ומה שאנחנו רוצים לעשות זה לרשת ValidationAttribute. כל אחד מה-validatoren שראינו מקודם, ה-attributes האלה, יורשים מזה ואנחנו בונים גם אחד שיורש מזה.
מה אנחנו בעצם בודקים? שלא חוקי שיהיה יותר מ-space אחד בכל מקום במחרוזת עצמה למעשה. עכשיו בינינו regular expression גם יודע לעשות את זה.
אנחנו יכולנו לכתוב פה איזשהו regular expression שיודע לבדוק האם יש לי extra spacing. הכוונה נניח שה-title של הספר זה לא C++ רווח, רווח בטעות for beginners.
נניח אני לא רוצה שיהיה פה שני רווחים אלא שיהיה רק רווח אחד. אז כמובן ש-regular expression יודע לעשות את זה, אבל נניח שאנחנו רוצים לראות איך עושים את זה בעזרת custom validator.
אז בנינו custom validator מיוחד בשבילנו ואנחנו רוצים to override את הפונקציה IsValid. יש לנו שתי פונקציות, אחת שפשוט מקבלת רק את אותו אובייקט שאנחנו רוצים לבדוק, את אותו value שאנחנו רוצים לבדוק.
מה זה ה-value שאנחנו רוצים לבדוק? אותו משתנה שנשים את ה-validator מעליו. אם הייתי שם את ה-extra spacing הזה כאן אז ה-value היה מה שמנסים להכניס ל-title, ואם הייתי שם אותו פה, תכף נשים אותם, אז ה-value היה מה שמנסים להכניס ל-description.
אז יש לי פה אפשרות ל-IsValid ולקבל את ה-value או IsValid ולקבל גם את ה-value וגם