אדר (4)

פיצ'רים שאפשר להכניס למחלקת הבסיס של דף

סקוט מיצ’ל, מומחה דוטנט שכותב במקומות נחשבים כמו 4GuysFromRolla וב-msdn magazine , כתב מאמר מצוין על יצירת מחלקת בסיס לדף aspx.
כל דפי asp.net יורשים ממחלקת ה-Page הנמצאת ב-System.Web.UI. מחלקת Page מגדירה את כל הפונקציונליות הבסיסית של ארועים, מתודות ומשתנים המשותפים לכל דפי ה-asp.net. זה כולל אובייקטים משותפים כמו Request, Response ו-Session, כמו גם המנגנון לסיריאליזציה של view state, הכנסת קוד client side, וניהול מחזור החיים של דף aspx.
לפונקציונליות הזאת אפשר להוסיף פונקציונליות נוספת – ספציפית לכל פרוייקט – ע”י:
1) יצירת מחלקה משלנו הכוללת את הפונקציונליות הנוספת הרצויה
2) יצירת המחלקה לעיל כך שתירש מהמחלקה Page
3) שינוי דפי ה-aspx בפרוייקט כך שיירשו מהמחלקה שיצרנו בצעד מס’ 1, ולא מהמחלקה Page של ה-framework של .NET.
מחלקות מותאמות אישית כאלה נקראות base page classes. כאמור, מחלקות אלה מכילות בד”כ התאמות ספציפיות לפרוייקט שבו הן נמצאות, אבל הן גם יכולות להכיל פונקציונליות יותר רחבה, שמסיבה כזו או אחרת לא מסופקת ע”י מייקרוסופט במחלקת ה-Page שלהם.
המאמר של סקוט מספר על 4 פיצ’רים שאפשר להוסיף למחלקת הבסיס של כל אחד.
1) להציג alert של JavaScript מה-code behind
כן, אפשר לעשות את זה, ע”י שימוש במחלקה בשם ClientScript. מאחר שהשימוש בה כולל מספר שורות קוד, כדאי לעטוף אותן במתודה – אפשר לקרוא לה displayAlert, לדוגמה – באופן כזה שכל דף שיירש מהמחלקה שיצרנו יוכל להשתמש בפקודה כזו:

DisplayAlert(“Hello, world!”);

הקוד למימוש המתודה הזו נמצא במאמר של סקוט. בכלל, אפשר להוריד את כל הקוד המוזכר מהמאמר עצמו.
2) לחפש פקד באופן רקורסיבי בהיררכיית הפקדים:
כל הפקדים של ASP.NET מכילים מתודת FindControl(id) המחפשת את הפקדים-ילדים של הפקד שה-id שו הועבר למתודה. למרבה הצער, FindControl לא מצליחה לחדור מבעד ל-naming containers שמשתמשים בהם בפקדים תבניתיים (templated controls). התוצאה היא שיכול להיות מאד מעצבן לפנות תכנותית לאחד הפקדים בתוך פקד תבניתי. החדשות הטובות הן שממש לא קשה לכתוב מתודת FindControl רקוסיבית, ומתודה כזאת מתאימה בתוך מחלקת בסיס של דף.
3) לתעד זמני ביצועים של הדף:
לפעמים נשמח אם נוכל לדעת כמה זמן לקח לדף מסוים להתעבד על השרת, או כמה זמן לקחה פעולה מסויימת. אמנם יש את ה-trace של ASP.NET, אבל לפעמים יש שם יותר מדי מידע. גישה פשוטה יותר היא שמחלקת הבסיס תיתן אופציה להקליט ולהציג את זמני הריצה. מאחר שלא תמיד נרצה למדוד ולתעד זמני ביצועים בכל הדפים, כדאי להוסיף למחלקה property שיציין איפה לבצע את המדידות הללו.
4) לתת כותרת (title) לדף.
המתודה המוצעת בודקת אם הדף נמצא ב-SiteMap. אם כן – היא תתן לו את הכותרת משם, ואם לא, היא תתן לו את השם של הדף, ללא הסיומת. מתברר שיש הרבה יותר מדי דפים שקוראים להם Untitled Page (חיפוש בגוגל של-Untitled Page)….

חוץ מההצעות שמיצ’ל מציע במאמר הזה, נתקלתי במאמר על שימוש ב-session, ומדובר שם על שימוש מושכל באובייקט הזה. כידוע, הדרך לפנות לאובייקטים הנשמרים ב-session היא ע”י סוגריים מרובעים ושם האובייקט (למשל session[“ItemDescription”]). כמובן שהדרך הזו פותחת פתח לשגיאות בגלל טעויות הקלדה. דרך טובה יותר לפנות לאובייקט היא כך:
this.UserSession.ItemDescription
כדי לממש את זה, המאמר מסביר איך ליצור מחלקה שתייצג את אובייקט session, ושמחלקת הבסיס שלנו תשתמש בה.
למי שמשתמש ב-session ברחבי האפליקציה, המאמר מאד מומלץ, על אף אריכותו.

כתבו תגובה

כתובת הדוא"ל שלכם לא תוצג.