דעה: ASP.NET WebForms – חלק ב'

שייך לקטגוריות .NET, ASP.NET

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

כמה פעמים ראיתי קוד כמו

void btn_Click(object sender,EventArgs e) {
        Response.Redirect("Page.aspx?Param=Value");
}

יש למישהו מושג איזה תהליך קורה כשלוחצים על הכפתור עד שמגיעים ללינק?

אז תיאור קצרצר:

  1. לחיצה על הכפתור מפעילה רוטינות JS לבדוק שהטופס ואלידי בהקשר של אותו Validation Group של הכפתור (אם יש), ובנוסף שמה את הכפתור כ-EventTarget
  2. אם הכל כשורה – הטופס נשלח לשרת יחד עם כל ערכי הפקדים הקיימים על העמוד וכמובן ה-ViewState
  3. מגיעה בקשת HTTP לשרת, כל הרוטינות הרגילות, הפניות, יצירת HttpContext, הרצת כל ה-HttpModules – טעינת Session, Cache וכו'
  4. העמוד המכיל את הכפתור רץ: נוצר מופע מהמחלקה של העמוד
  5. כל שרשרת האירועים רצה, אתחול culture, קונטרולים, init, load, render וכמובן שרשרת האירועים של קונטרולים מקוננים בעמוד שלנו
  6. אירוע ה-Click ששמנו לכפתור, בין אם ב-aspx בעזרת asp:Button OnClick=btn_Click או בין אם בקוד בעזרת btn.Click+=btn_Click, מחווט ונרשם לכפתור
  7. השרת עכשיו בודק מי ה 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 תגובות

כתיבת תגובה

12.06.08 בשעה 20:17
TheWizard

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

1
12.06.08 בשעה 20:26
24sharon

מאמר יפה, מאמר נכון, חסר לדעתי רק הפתרון
location.href ="Page.aspx?Param=Value";

2
12.06.08 בשעה 20:36
אלעד
TheWizard אמר/ה:
נתת דוגמה למקרה פשוט מדי שבו את Value לא צריך לחשב בשרת.
אבל מה אם הוא צריך להיות מחושב בשרת טרם ההעברה לעמוד החדש? האם יש דרך יעילה יותר?

בכל מקרה תמיד תהיה דרך לא להגיע לכל צנרת ה-ASP.NET בפעולות מסוג כזה. ניתן בקלות לעבוד מול ashx או ajax כלשהו, אם באמת צריכים את השרת. במקרה הספציפי הזה אפשר למצוא דרך להביא את הערך לצד הלקוח, או לדעת לבקש אותו ב-Page.aspx.

24sharon אמר/ה:
מאמר יפה, מאמר נכון, חסר לדעתי רק הפתרון
location.href ="Page.aspx?Param=Value";

הפיתרון הזה צויין במאמר :)

3
13.06.08 בשעה 6:48
24sharon
אלעד אמר/ה:
Page.aspx.

24sharon:מאמר יפה, מאמר נכון, חסר לדעתי רק הפתרון

location.href ="Page.aspx?Param=Value";
הפיתרון הזה צויין במאמר :)

צודק לא שמתי לב :)
תמשיך לעדכן ולכתוב בבלוג, זה בהחלט בלוג עם תוכן משובח.

4
14.06.08 בשעה 19:23
אוהד אסטון
(אתר)

ל – Wizard, אם ניתן ליצור אותו בזמן שהדף עולה, אז אפשר להשתמש במשתנה, ולהציב אותו עם < % = myParameter %>

5
16.06.08 בשעה 7:25
יוסי

אבל גם לעבוד עם handler אתה מייצר postback אלא א"כ הקריאה היא ajax

מה היא הדרך האולטימטיבית מבחינתך ואיך הכי כאי לעבוד?

6
16.06.08 בשעה 7:45
אלעד
יוסי אמר/ה:
אבל גם לעבוד עם handler אתה מייצר postback אלא א"כ הקריאה היא ajax

מה היא הדרך האולטימטיבית מבחינתך ואיך הכי כאי לעבוד?

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

ב-handler (קובץ ashx שמממש IHttpHandler) אמנם יש מעבר דרך HttpModules אך כל ערבוב ה-UI וה-Server Side לא קיים. היות הפנייה ל-ashx ב-ajax או לא, לא משנה את הפעולה שמתבצעת.

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

7
16.06.08 בשעה 9:59
יוסי

אתה יכול לתת דוגמא לעמוד aspx שמדבר ישירות עם handler? (ללא ajax, השארתי את כתובת המייל שלי במידה וPost הוא לא הבמה לכך)

אני מניח שיש דרך לדבר עם handler ללא ביצוע כל תהליך הpostback

8
16.06.08 בשעה 10:13
אלעד
יוסי אמר/ה:
אתה יכול לתת דוגמא לעמוד aspx שמדבר ישירות עם handler? (ללא ajax)

אני מניח שיש דרך לדבר עם handler ללא ביצוע כל תהליך הpostback

כדי לתקשר בין aspx ל-ashx צריך ajax. כלומר XMLHttpRequest (לאו דווקא זה של microsoft). אבל, לא מתבצע פה PostBack. ה-aspx פונה למקור מידע עצמאי עם פרמטרים ו-session (אם מאפשרים ל-handler לקבל) ומקבל חזרה תשובה. ה-ashx לא מכיר את הקונטרולים על ה-aspx, ומדלג על הרבה מאוד שלבי טיפול בקונטרולים, שלבים שברוב המקרים לא צריך אותם, והיו קורים במקרה של PostBack.

9
16.06.08 בשעה 10:32
יוסי
אלעד אמר/ה:
יוסי:אתה יכול לתת דוגמא לעמוד aspx שמדבר ישירות עם handler? (ללא ajax)

אני מניח שיש דרך לדבר עם handler ללא ביצוע כל תהליך הpostback

כדי לתקשר בין aspx ל-ashx צריך ajax. כלומר XMLHttpRequest (לאו דווקא זה של microsoft). אבל, לא מתבצע פה PostBack. ה-aspx פונה למקור מידע עצמאי עם פרמטרים ו-session (אם מאפשרים ל-handler לקבל) ומקבל חזרה תשובה. ה-ashx לא מכיר את הקונטרולים על ה-aspx, ומדלג על הרבה מאוד שלבי טיפול בקונטרולים, שלבים שברוב המקרים לא צריך אותם, והיו קורים במקרה של PostBack.

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

10
06.09.08 בשעה 19:07
משה
(אתר)

ישר כח! הסבר חד ואיכותי למה שאני כבר שנים חושב ואומר.

11
26.09.08 בשעה 6:45
אבי
(אתר)

הדגמת כאן את ה worst practice שאפשר להגיע אליו עם webForms,
ולצערי כבר יצא לי לראות קוד כזה.
דוגמא מזעזעת נוספת:
enable/disable של פקדים לאחר סימון checkbox – כבר ראיתי קוד שבו ה checkbox מוגדר כ autoPostback ואז בשרת שינו את ה enable של פקדים מסויימים.
אבל "ASP.NET מרגילה מתכנתים לעבוד בצורה בזבזנית ומחפירה בכל הקשור ל-UI." זו אמירה קצת קשה לא?
כל מתכנת WEB שמבין מה קורה בין השרת ללקוח, או שלא מבין אבל מתעניין וקורא ברשת לעולם לא יכתוב קוד כזה

12

כתיבת תגובה

תגיות מותרות לשימוש בתוכן
XHTML: אפשר להשתמש בתגים הללו: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre>