ViewState: All You Wanted to Know

אבי דקל

New member
ViewState: All You Wanted to Know

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

אבי דקל

New member
שאלה נוספת בבקשה :

כעת קראתי את המאמר הזה (The ASP.NET Page Life Cycle) זה רק עשה לי סלט במוח
אנסה לכתוב כאן מה הבנתי (במשפט אחד) מכל שלב, אשמח לקבל השלמות ותיקונים ממי שכוח במותניו
שלב 1: OnInit - יצירת האובייקטים המוגדירם ב Code Behind, פרט לאובייקטים שהוגדרו ב ASPX, לא בטוח שהם נוצרו עדיין. (מדוע ? הם נוצרים בפעם הראשונה שניגשים ל ASPX והוא מתקמפל...) שלב 2 : LoadViewState - טעינת הערכים שנשמרו ב ViewState עבור הקנטרולים שמסך. שלב 3 : LoadPostData - לא הבנתי מה ההבדל בין זה לבין השלב הקודם, שניהם טוענים את ערכים הפקדים... שלב 4 : OnLoad - יצירת עץ הפקדים. שלב 5 : RaisePostDataChanged - לא הבנתי מה המטרה שלו. שלב 6 : RaisePostBackEvent - כנ"ל
לא הבנתי מטרתו. שלב 7 : OnPreRender - שינויים אחרונים בצורת הצגת הפקד ללקוח. שלב 8 : SaveViewState - לא הבנתי מה הקשר של שמירת ערכי ViewState, אני הרי בשרשרת פעילויות של הצגת העמוד, ולא שמירת ערכים... שלב 9 : OnRender - יצירת HTML הסופי ללקוח (כל פקד מצייר את עצמו). שלב 10 : Disposal - ממי בדיוק נפטרים, ולמה ? הרי אמורים לשמור על הקשר איתם (ע"פ עץ הפקדים),לא ? אשמח מאוד (מאוד) לשמוע השלמות לשלבים שלא הבנתי, ולא פוח אשמח (גם מאוד מאוד
) שתתקנו את שגיאותי, ותוסיפי פרטים חשובים שהשמטתי בשלב כזה או אחר
Thanks Ladies !
 

nattygur

New member
אולי זה יעזור לך להבין את כל התמונה

1)שלב ראשון - קרא את הפוסט בבלוג שלי על מאחורי הקלעים של קבצי ASPX. קובץ ה ASPX הופך למחלקה אשר יורשת ממחלקת ה CodeBehind. ראשית נקרא הבנאי של המחלקה הזאת ואז פונקציה בשם FrameworkInitialize אשר למעשה מאתחלת ובונה את כל עץ האובייקטים ב HTML. 2) שלב שני - קריאה למחלקת ה CodeBehind והפעלת OnInit. 3) שלב שלישי - בשלב הזה נטען ה ViewState של הפקדים, אם נשלחו לתחנה. הארוע תמיד יתבצע משום שהדף תמיד שולח ב ViewState מזהה של הדף. הפקדים משתמשים במידע הזה לבנות עצמם. ListBox לדוגמה שומר את ה Items שלו ובשלב זה טוען אותם ובונה את כל ה Itema של האובייקט. 4) שלב רביעי - שלב זה קורא את הערכים אשר נשלחו ב POST עבור האוביקטים ומשתמש בהם לעדכן את הפקד. ListBox לדוגמה ישתמש בערך ב Form בכדי לסמן את ה Item הנבחר, Textbox את ה Text שלו וכו'. 5) ארוע ה ONLoad - מאפשר לך להוסיף קוד שיתרחש עם עליית הדף, לפני סיום תהליך הבניה שלו. הוספה דינאמית של פקדים, אירועים וכו אינה אפשרית מעבר לאירוע זה. 6) שלב שישי - - אירוע אשר מועלה ע"י כל פקד אשר הנתונים אשר נשלחו ב FORM שונים מהנתונים של הפקד (לאחר שנבנה מה Viewstate, אם נשלח מידע ב ViewState) וסיים לעדכן את הנתונים. 7) שלב שביעי - הדף מזהה איזה פקד ביקש להפעיל אירוע ואיזה אירוע ומעביר את הבקשה לפקד אשר מעלה את האירוע. 8) שלב שמיני - שינויים אחרונים ב HTML אשר ישלח לתחנה - שינויים בפקד. 9) שלב תשיעי - ישמור את נתוני ה ViewState אשר נשלחו ע"י פקדים והדף לשדה נסתר ב FORM. 10) יצירת HTML 11) מנקה את כל ה Resources שהם לא Managed ולא ינוקו ע"י ה GC.
 

nattygur

New member
OK

ViewState זאת דרך לאפשר לפקדים לשמור מידע שהם רוצים בעת ביצוע הדף כך שיוכלו להשתמש בו בעת קריאה לדף ב PostBack. בדרך כלל הפקדים נוהגים לשמור מידע אשר לא יכול לעבור ע"י שימוש במנגנון ה FORM. כל אלמנט HTML מסוג <Input> נתוניו נאספים ונשלחים ב FORM בעת שליחת בקשה לשרת. ה VIew state משמש ברוב המקרים לשמור מידע שלא נשלח ב FORM דוגמאת כל מרכיבי ה ListBox. שליחת כל מרכיבי ה ListBox (Items) מאפשרת לפקד לבנות את כל מרכיביו ללא גישה נוספת לבסיס הנתונים, אותו דבר גם לגבי Grid. שים לב שכל פקד ממש לוגיקה אחרת ושומר נתונים אחרים אבל לעולם לא את הערך שיחזור עם ה Form. אם אתה רוצה לעשות טיפה Hacking אתה יכול לעשות Override לפונקציה SavePageStateToPersistenceMedium ולבדוק את הפרמטר אשר מכיל את נתוני ה ViewState. אתה יכול לקרוא על זה יותר בבלוג שלי או להמתין לקורס\כנס שאני יעביר.
 

אבי דקל

New member
אני לא בטוח שהבנתי ../images/Emo13.gif

אבל קודם כל תודה
יהיה נכון לומר שבעצם כל הפקדים בטופס שלי, מחולקים לשניים : 1. פקדים שבתוך טופס - שהערכים שלהם נשמרים אוטומטית בין PostBack ל PostBack, ללא קשר לנושא ה ViewState. 2. שאר הפקדים - שע"מ לשמור את הנתונים שלהם בין פוסטבאק לפוסטבאק, חייבים לאפשר את ViewState הבנתי נכון ? במחשבה שניה... כל הפקדים שלי חייבים להיות תחת form, לא ?
 

nattygur

New member
כל הפקדים תחת ה Form

כל הערכים של הפקדים עוברים דרך ה FOrm מידע נוסף שנדרש ע"י פקד דרך ViewState.
 

אבי דקל

New member
המממ....

כלומר ההפרדה היא לא פקדים מחוץ ל FORM ופקדים בתוך ה FORM, מכיוון שבעצם כל הפקדים בתוך ה FORM. אולי בכל זאת הבנתי : לכל פקד, יש ערכים שעוברים אוטומטית דרך ה Form בין פוסטסק לפוסטבק, גם ללא VieState. שאר הערכים/מידע, שלא עובר אוטומטית, צריך להעביר (אם רוצים), עזרת ViewState. הבנתי ?
 

אבי דקל

New member
../images/Emo45.gif אז כיצד אני יכול לדעת.....

אילו ערכים כן עוברים בין פוסטבק לפוסטבק ע"י מנגנון ה Form, ואיזה לא ?
 

אבי דקל

New member
../images/Emo35.gif ../images/Emo35.gif

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

gilad g

New member
בעצם

אתה רוצה לראות את התוכן של ה-ViewState? תדליק trace לדף שלך:
<%@Page Trace="ture"%>​
 

nattygur

New member
אני חושב שמה שכתבת פעם אחרונה מסביר

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

אבי דקל

New member
עדיין ללא תשובה... ../images/Emo13.gif

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

nattygur

New member
אה, זאת באמת בעיה משום

שכל פקד יכול לשמור מה שהוא רוצה. אתה כבר יודע מה ListBox שומר .... אין כאן כללים אבל בדרך כלל פקדים שומרים מידע שיעזור להם לייצר את עצמם מחדש, בדיוק כפי שהיו לפני שהדף נשלח בפעם הקודמת, ללא צורך לגשת ל Database או Disk או כל מידע אחרת שתפגע במהירות העיבוד של הדף.
 
למעלה