ASP.NET מרגילה מתכנתים לעבוד בצורה בזבזנית ומחפירה בכל הקשור ל-UI. כאחד שעוסק שנים רבות בפיתוח ל-Web בשלל טכנולוגיות, כל הזמן היה דגש כמה שפחות להטריד את השרת. לא רק ש-ASP.NET WebForms לא עושה את זה, היא אפילו מעודדת להטריד כמה שיותר. וזה פשוט רע.
כמה פעמים ראיתי קוד כמו
void btn_Click(object sender,EventArgs e) {
Response.Redirect("Page.aspx?Param=Value");
}
יש למישהו מושג איזה תהליך קורה כשלוחצים על הכפתור עד שמגיעים ללינק?
אז תיאור קצרצר:
- לחיצה על הכפתור מפעילה רוטינות JS לבדוק שהטופס ואלידי בהקשר של אותו Validation Group של הכפתור (אם יש), ובנוסף שמה את הכפתור כ-EventTarget
- אם הכל כשורה – הטופס נשלח לשרת יחד עם כל ערכי הפקדים הקיימים על העמוד וכמובן ה-ViewState
- מגיעה בקשת HTTP לשרת, כל הרוטינות הרגילות, הפניות, יצירת HttpContext, הרצת כל ה-HttpModules – טעינת Session, Cache וכו'
- העמוד המכיל את הכפתור רץ: נוצר מופע מהמחלקה של העמוד
- כל שרשרת האירועים רצה, אתחול culture, קונטרולים, init, load, render וכמובן שרשרת האירועים של קונטרולים מקוננים בעמוד שלנו
- אירוע ה-Click ששמנו לכפתור, בין אם ב-aspx בעזרת asp:Button OnClick=btn_Click או בין אם בקוד בעזרת btn.Click+=btn_Click, מחווט ונרשם לכפתור
- השרת עכשיו בודק מי ה EventTarget שלו ומגלה שזה הכפתור. עכשיו הוא יורה את אירוע ה-Click של הכפתור ומגיע לנחלה – מבצע Response.Redirect.
עכשיו שלבים 3-5 רצים שוב עבור העמוד אליו הפנינו.
נשמע הגיוני? לי ממש לא.
<a href="Page.aspx?Param=Value">click</a> <button onclick="location.href='Page.aspx?Param=Value';">click</button>
זה הרבה יותר טוב.
אז נכון, לא כולם עושים את זה. אבל לשם דוט נט מובילה אנשים שלא מכירים את התחום. ובמלוא מובן המילה – זה רע.
חושבים שזה לא משפיע? המשתמשים/לקוחות שלכם כבר יודעים לזהות אתר עם סיומת aspx כאתר שהולך להיות איטי לגלוש בו. כל האינטראקציה הלוך ושוב בין הקליינט לסרבר כל כך מיותרת ומכבידה על הגלישה עצמה. חוויית משתמש נוראית.
התדמית של ASP.NET כל כך יורדת בגלל היישום התמוה שמיקרוסופט עשו, גם בעיני משתמשים ובטח בעיני מתכנתים אחרים.
תחשבו על הסיטואציה הבאה: אתם מטיילים עם העכבר שלכם על המסך. בכל תזוזה של פיקסל – כל הפיקסלים על המסך מתרנדרים מחדש. הופכים להיות שחורים לעשירית שנייה ומקבלים צבע.
עכשיו תשוו את זה ל-ASP.NET WebForms
12 תגובות
כתיבת תגובה
נתת דוגמה למקרה פשוט מדי שבו את Value לא צריך לחשב בשרת.
אבל מה אם הוא צריך להיות מחושב בשרת טרם ההעברה לעמוד החדש? האם יש דרך יעילה יותר?
מאמר יפה, מאמר נכון, חסר לדעתי רק הפתרון
location.href ="Page.aspx?Param=Value";
בכל מקרה תמיד תהיה דרך לא להגיע לכל צנרת ה-ASP.NET בפעולות מסוג כזה. ניתן בקלות לעבוד מול ashx או ajax כלשהו, אם באמת צריכים את השרת. במקרה הספציפי הזה אפשר למצוא דרך להביא את הערך לצד הלקוח, או לדעת לבקש אותו ב-Page.aspx.
הפיתרון הזה צויין במאמר
צודק לא שמתי לב
תמשיך לעדכן ולכתוב בבלוג, זה בהחלט בלוג עם תוכן משובח.
ל – Wizard, אם ניתן ליצור אותו בזמן שהדף עולה, אז אפשר להשתמש במשתנה, ולהציב אותו עם < % = myParameter %>
אבל גם לעבוד עם handler אתה מייצר postback אלא א"כ הקריאה היא ajax
מה היא הדרך האולטימטיבית מבחינתך ואיך הכי כאי לעבוד?
PostBack הוא תהליך שליחת הטופס, viewstate, פראסינג של viewstate, טעינה מחודשת של כל היררכיית הקונטרולים בעמוד וכו'
ב-handler (קובץ ashx שמממש IHttpHandler) אמנם יש מעבר דרך HttpModules אך כל ערבוב ה-UI וה-Server Side לא קיים. היות הפנייה ל-ashx ב-ajax או לא, לא משנה את הפעולה שמתבצעת.
אין דרך אולטימטיבית לעבוד, כי יש הרבה דרכים וכל אחת מתאימה למשימה שאתה צריך לבצע, אבל יש דרכים שבהחלט יש לשקול מספר פעמים לפני השימוש בהן.
אתה יכול לתת דוגמא לעמוד aspx שמדבר ישירות עם handler? (ללא ajax, השארתי את כתובת המייל שלי במידה וPost הוא לא הבמה לכך)
אני מניח שיש דרך לדבר עם handler ללא ביצוע כל תהליך הpostback
כדי לתקשר בין aspx ל-ashx צריך ajax. כלומר XMLHttpRequest (לאו דווקא זה של microsoft). אבל, לא מתבצע פה PostBack. ה-aspx פונה למקור מידע עצמאי עם פרמטרים ו-session (אם מאפשרים ל-handler לקבל) ומקבל חזרה תשובה. ה-ashx לא מכיר את הקונטרולים על ה-aspx, ומדלג על הרבה מאוד שלבי טיפול בקונטרולים, שלבים שברוב המקרים לא צריך אותם, והיו קורים במקרה של PostBack.
את השיטה הזו אני מכיר
תודה בכל מקרה.
ישר כח! הסבר חד ואיכותי למה שאני כבר שנים חושב ואומר.
הדגמת כאן את ה worst practice שאפשר להגיע אליו עם webForms,
ולצערי כבר יצא לי לראות קוד כזה.
דוגמא מזעזעת נוספת:
enable/disable של פקדים לאחר סימון checkbox – כבר ראיתי קוד שבו ה checkbox מוגדר כ autoPostback ואז בשרת שינו את ה enable של פקדים מסויימים.
אבל "ASP.NET מרגילה מתכנתים לעבוד בצורה בזבזנית ומחפירה בכל הקשור ל-UI." זו אמירה קצת קשה לא?
כל מתכנת WEB שמבין מה קורה בין השרת ללקוח, או שלא מבין אבל מתעניין וקורא ברשת לעולם לא יכתוב קוד כזה
כתיבת תגובה
תגיות מותרות לשימוש בתוכן
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre>