
Session["MyColor"] = Color.Red שומר את הצבע, ו-Session["MyColor"] שולף אותו. כל פריט באוסף מוגדר כ-Object, ולכן בשליפה צריך המרה (cast) לסוג הנכון.system.web ובתגית sessionState עם המאפיין timeout בדקות. לדוגמה 3 דקות.Session_Start מתרחש כשלקוח חדש מקבל Session, ו-Session_End מתרחש כשה-Session נהרס בגלל זמן החיים שפג. האירועים מתבצעים עבור כל לקוח בנפרד.הטקסט המלא של הדקות הראשונות בהרצאה «Session object - חלק 1» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אוקיי, אז מה שראינו בשיעור הקודם זה איך לשמור מידע בין ריצות חוזרות ונשנות לדף שלנו ברמת ה-ViewState, כלומר בתגית hidden שנשתלט בתוך דף ה-HTML, חוזרת ביחד עם קובץ ה-HTML בחזרה ללקוח, ובריצה הבאה של הלקוח לאותו הדף המידע שוב מגיע מהלקוח לשרת שאז מוציא את המידע מה-ViewState, התגית הזאת ויכול להחזיר
אותו לערכים של התגיות האחרות או למידע אחר ברמת הדף שלנו. אבל יש עוד דרכים לשמור מידע בין ריצות חוזרות ונשנות לאתר שלנו מעבר ל-view state.
הדבר הבא שאנחנו הולכים לראות ואיך לשמור מידע בין ריצות חוזרות ונשנות לאתר שלנו אבל לא ב-view state אלא בתגית מיוחדת או ליתר דיוק באובייקט מיוחד שנקרא סשן.
מה זה בדיוק הסשן? תגית view state זאתי תגית htmlית שנמצאת בדף. המידע שנשמר בתגית הזאת לא באמת נשמר בצד השרת.
המידע הזה נשתל בתגית וחוזר בחזרה ללקוח. אני יכול לשמור מידע גם בשרת עצמו בלי שהמידע יחזור בחזרה ללקוח בכל ריצה לשרת וחזרה ללקוח, המידע נמצא באובייקט מיוחד שיושב בצד של השרת ומחזיק מידע שהוא פר לקוח.
איך אני מבצע את זה? בואו ניקח דוגמה ללחצן שמסוגל לשמור מידע באובייקט הזה ולחצן אחר שיהיה מסוגל לקרוא מידע מהאובייקט הזה. ניקח ASP בטן, יש לנו פה לחצן לשמירת מידע ולחצן נוסף לתינת המידע.
אוקיי, בלחצן ששומר מידע אני רוצה להגיע לאובייקט המיוחד הזה תמיד קיים לי בצד של השרת ולהכניס לתוכו איזשהו פריט אינפורמציה.
האובייקט הזה נקרא fashion, אני רואה שיש לי גישה אליו. fashion זה אוסף, כלומר קולקשן, שכל פריט בו ניתן לגישה על ידי key או name, כלומר מפתח.
אני יכול להשתמש במפתח מספרי, כלומר אינדקס, ואז אני מגיע למיקום של הפריט בתוך האוסף, אבל אני לא אמור לדעת מה המיקום שלו, ולכן לא נהוג להשתמש באינדקס של הפריט.
לכן אני יכול להשתמש ב-Name שלו, בשם של הפריט עצמו. בשביל להכניס מידע אני ממציא שם ייחודי, לדוגמה MyColor, ואז על ידי השמה פשוטה אני יכול להכניס מידע לתוכו.
אני כרגע הכנסתי את הצבע אדום לתוך תא הזיכרון בתוך האוסף הזה, שקראתי לו MyColor, כלומר השם של המידע שלי נקרא MyColor וה-Value שלו, הערך שלו זה color.red ואת זה הכנסתי לאוסף סשן.
עכשיו איך אני מוציא את המידע מהאוסף? בלחצן Load אני פשוט מאוד פונה למקום שנקרא MyColor ובצורה כזאת יכול לשלוף ממנו את המידע. בואו נפתח משתנה color, נכניס לתוכו את הערך אבל מבחינת C-Sharp כל פריט שנמצא בתוך האוסף סשן הוא מטיפוס Object.
אם אני רוצה לקחת את הפריט הזה ולהכניס אותו למשתנה מטיפוס אחר אני צריך לבצע פעולת השמה או יותר נכון פעולת קאסטינג. בואו עכשיו נפנה ללחצן ונצבע לו את צבע הרקע לצבע הזה.
בואו נריץ. אז אני ראשית לוחץ על הלחצן סייב ואז אני לוחץ על לואוד ואני רואה בעצם שהצבע אכן נטען אבל מה היה קורה אם ראשית הלקוח היה לוחץ על לחצן לואוד.
שוב נריץ את האתר שלנו ונלחץ ישירות על לחצן לואוד בלי לפני זה ללחוץ על סייב. אני רואה שקיבלתי exception שנקראת object reference not set to an instance of an object.
זאת ה-exception, כלומר החריגה הנפוצה ביותר שקיימת. וזה אומר שניסיתי לבצע פעולה עם איזשהו אובייקט שהערך שלו הוא נל.
איפה היה לי פה אובייקט שהערך שלו נל? אז למעשה מה שקורה כאן זה שאם לא הכנסתי ערך לתוך אוסף ה-session ואני מנסה להשתמש בערך הזה, אז ערכו נ"ל.
מן הראוי שנבדוק לפני זה שאכן באמת יש בערך הזה מידע תקף ולא נ"ל. כלומר, רק אם סשן במיקום MyColor שונה מנ"ל, רק אז אני רוצה לבצע את הפעולה הזאת של הוצאת המידע מתוך הסשן.
בואו נבדוק. נלחץ על לחצן Load בלי ללחוץ לפני זה על Save, ושום דבר לא קורה, לא מתקבלת שום קריסה. נלחץ על לחצן סייב, המידע נשמר בצד השרת, נלחץ על לחצן לואוד, המידע נטען.
יש לשים לב שהמידע לא נשמר בתגית view state. אין קשר בין המידע הזה לבין התגית הזאת של ה-view state. המידע של הפשן נשמר בצד של השרת במחשב השרת באתר שלנו, בתוך אוסף מיוחד שנקרא פשן, כאשר נתנו לו name ושם בדיוק המידע נשמר, הוא לא חוזר ללקוח.
ועל כך בריצות חוזרות ונשנות לאתר שלנו אנחנו יכולים לשלוף את המידע הזה ולהשתמש בו שוב. מה היה קורה אם הייתי רוצה להשתמש במידע הזה בדף אחר?
בואו ניצור פה עוד דף. ניקח פה דף שנקרא Second Page, נגדיר פה גם כן לחצן, נוציא את המידע שבסשן ונכניס אותו גם ללחצן השני.
בואו נגלוש ראשית לדף הראשון ומהדף הראשון נגלוש לדף השני לאחר שנכניס את המידע. כלומר אנחנו צריכים פה לחצן אחר שיביא אותנו לדף השני או איזשהו לינק.