
__VIEWSTATE. הערך שבו מקודד, לא מוצפן, ולכן אפשר לפענח אותו בקלות. הוא מכיל את הערכים של הרכיבים.ViewState["ComputerNumber"] = num. בדוגמה של משחק ניחוש בין 1 ל-100, המספר שהמחשב מגריל נשמר בפעם הראשונה שהדף נטען, בתנאי if (!IsPostBack). בכל לחיצה משווים את הניחוש של המשתמש למספר שנשמר.הטקסט המלא של הדקות הראשונות בהרצאה «ViewState» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אוקיי, הנושא הבא שלנו ב-sp.net נקרא שמירת מידע בין ריצות חוזרות ונשנות לאתר. ישנן מספר שיטות לשמור מידע בין ריצות חוזרות ונשנות לאתר.
כלומר, לקוח מבצע פעולה באתר, אני רוצה לשמור פרט אינפורמציה כלשהו לגבי אותו לקוח או לגבי כלל הלקוחות, ובפעם הבאה שהוא מגיע לאתר שלי באותה גלישה או בגלישה אחרת, אני רוצה להשתמש במידע הזה.
הדבר הראשון שאנחנו הולכים לראות נקרא view state. ViewState הינה שיטה אחת לשמור מידע בין ריצות חוזרות ונשנות לאתר על ידי אותו לקוח באותו הדף.
בשביל להבין מה זה ViewState בואו נסתכל קודם כל על משהו מאוד מעניין. אנחנו יודעים שכשהלקוח גולש לדף והוא גולש לדף בעל סיומת ASPX עבור ASP.NET.
ביחד עם הדף הזה יושב לו דף C-Sharp שמחזיק אירועים. האירועים של C-Sharp של הדף מתבצעים בצד השרת. בקובץ ה-C-Sharp ישנה מחלקה, כרגע היא נקראת Home Page, שמנהלת את הדף ובתוכה יש את האירועים הללו.
המחלקה הזאת יורשת מ-Page. ואנחנו יודעים שכאשר אנחנו גולשים לדף הזה, קוד ב-C-Sharp מתבצע בצד של השרת. אוקיי, דבר נוסף שאנחנו צריכים לדעת בקשר לזה זה שבגלישה סטנדרטית של הלקוח לדף הזה נוצר אובייקט מהמחלקה והאובייקט משרת את הגלישה הנוכחית לדף וזה לא משנה אם
זאת הייתה גלישה ראשונה של הלקוח אל הדף או שהוא לחץ על לחצן בכדי לבצע אירוע בצד השרת בכל אחד מהמקרים האלה במצב קלאסי של גלישה רגילה נוצר אובייקט חדש מהמחלקה הזאת בכדי לשרת את הגלישה הנוכחית אז בואו בואו נסתכל על כמה דברים מבחינת C-Sharp.
מה קורה לאובייקט ממחלקה ב-C-Sharp כאשר הוא נוצר בצורה חדשה לגמרי? אם נניח הייתי רוצה לשמור מידע ברמת האובייקט הזה, בואו נסתכל מה היה קורה.
נניח שיש לי פה איזשהו משתנה. מה שאני רוצה לעשות, אני רוצה לשמור במשתנה הזה מידע שישמר לי בין כל ריצה חוזרת ונשנית לאותו הדף.
ניקח לחצן ותפקיד הלחצן הזה יהיה לשמור מידע בתוך המשתנה הזה. נפנה למשתנה ונכניס לתוכו מספר.
כאשר אני אלחץ על הלחצן המספר 123 הולך להיכנס לתוך המשתנה x שהוגדר ברמת המחלקה. כלומר המשתנה x הוא data member של המחלקה שלנו.
אוקיי בואו עכשיו ניקח עוד לחצן כדי לקרוא את המידע ואני פשוט אציג את המידע שיש לי בתוך המשתנה על המסך.
בואו נריץ. אוקיי, יש לי כאן שני לחצנים. אני לוחץ על הלחצן הראשון כדי לבצע שמירה של המידע, ואז אני לוחץ על הלחצן השני בשביל לקרוא את המידע.
ואני רואה שהמספר 0, כלומר המספר 123 כביכול לא נשמר במשתנה. בואו נסתכל רגע מה באמת קרה כאן. לפני זה רק נחליף את הטקסט ל-read number. אוקיי, האם המידע באמת לא נשמר במשתנה?
אז התשובה היא כזאת: בכל פעם שאתם יוצרים אובייקט ממחלקה, כל המשתנים ברמת המחלקה, כלומר כל ה-data members שלו, מאופסים לגמרי, וזה לא משנה מה יש במשתנים האלה באובייקטים אחרים.
כאשר משתנה אינטג'רי מאופס, ערכו 0. זאת הסיבה שראינו 0. ומה שקרה כאן זה דבר מאוד פשוט. כאשר המשתמש לחץ על הלחצן בפעם הראשונה והגיע לקוד הזה, ברגע שהוא לחץ על הלחצן נוצר אובייקט חדש מהמחלקה Homepage, כל המשתנים מאופסים ואירוע הלחיצה של הלחצן התבצע.
המספר 123 נכנס לתוך המשתנה X, זאת אומרת שאכן בתוך המשתנה X היה מספר 123. אם הייתי מציג כאן את ערכו של X הייתי יכול לראות שאכן יש בו 123. בואו נסתכל על זה. אני לוחץ על Save Number, הצגתי את x ואכן אני רואה 123. אבל מה קרה כשלחצתי על read number ופתאום ראיתי את המשתנה 0. אז אמרנו שבכל פעם שישנה ריצה לשרת נוצר אובייקט חדש מהמחלקה שמשרתת את הדף.
כאשר אני לוחץ על read number זאת גם כן ריצה לשרת, כנ"ל כשאני לוחץ על save number זאת ריצה לשרת.
בכל פעם שלחצן fp.2 נלחץ נתבצעת ריצה לשרת. בכל ריצה כזאת נוצר אובייקט מהמחלקה הומפייג' ובגלל שהוא אובייקט חדש לגמרי הוא לא זוכר את ערכו של האובייקט הקודם.
אז בריצה של ה-btn-save נוצר x חדש, מוכנס לתוכו 123 וכאן אנחנו יכולים לראות שבאמת הדפסנו את 123. אבל כאשר לחצנו על הלחצן השני ה-x נוצר מחדש עבור אובייקט אחר לגמרי מהמחלקה הומפייג' ולכן ערכו 0.
מה שאנחנו למדים מכך זה שאנחנו לא יכולים לשמור מידע בין ריצות חוזרות ונשנות לאתר האינטרנט שלנו על ידי data members סטנדרטים של המחלקה. המצב הזה נקרא stateless.
יש שקוראים לזה בעברית חסר מצב. זה אומר שדף רגיל לא זוכר כברירת מחדל ערכים שהוכנסו בו בריצות חוזרות ונשנות, אפילו אם זה על ידי אותו לקוח ואפילו אם זה לאותו הדף.
אז איך בכל זאת אני יכול לשמור מידע בין ריצות חוזרות ונשנות לאותו הדף? בשביל להבין איך אני שומר מידע בואו נראה משהו מעניין בנוסף שקורה כאן.
בואו נסתכל שנייה אחת על דף ה-ASPX שלנו. בדף ה-ASPX שלנו אני עושה משהו בכדי להבהיר את הרעיון. ניקח כאן Label,