RegisterClientScriptBlock - מעניין:

gilad g

New member
הערה קטנה

"משתנה שמוגדר להצביע על אוביקט, המשתנה עצמו, בגודל קבוע והוא נמצא ב Stack". לא תמיד משתני reference מוגדרים ב-stack. אם, לדוגמא, אובייקט כלשהו מפנה לאובייקט אחר, אז ה-reference אל האובייקט הפנימי נשמר ב-heap ולא ב-stack, כי הוא חלק מהאובייקט החיצוני
 

gilad g

New member
כן

()ExecuteReader מאתחלת עבורך את האובייקט. בשביל מה צריך את זה? בכן, אלה אחד העקרונות הבסיסיים של תכנות מונחה עצמים. אם להחזיר אותך קצת ל-++C, בעצם כשאתה מצהיר על אוביקט באופן הזה:
myClass myObj;​
מאחורי הקלעים, בעצם הפכת את myObj לפוינטר לאובייקט מסוג myClass. הפוינטר הזה במצבו הראשוני, לא מצביע לכלום (null). כדי לאתחל את האובייקט, ולהקצות לו מקום של ממש בזכרון, משתמשים ב-new. הפקודה הזאת: myClass myObj = new myClass(); אומרת ל-CLR "צור לי מקום חדש בזכרון עבור האובייקט (וזה בעצם new myClass), ואת הפוינט למקום שבו הוא נמצא שים לי ב-myObj). מכאן ניתן להסיק שאובייקטים בדוט נט, אלא אם הוגדר אחת, תמיד עוברים by reference. קח, בתור דוגמא, את הקוד הבא: Apple app; app = new Apple(); app = new Apple(); בשורה הראשונה, הגדרנו פוינטר לאובייקט מסוג Apple. לפוינטר הזה קראנו app. בנתיים, הפוינטר הזה מכיל null, כלומר הוא לא מצביע לשום דבר. בשורה השניה, אנחנו מאתחלים ומקצים מקום בזכרון לאובייקט חדש מסוג Apple, ואת הכתובת שלו בזכרון אנחנו שמים בתוך app. עכשיו, app מצביע ל-instance של המחלקה apple. בשורה השלישית, אנחנו עושים שוב את אותו דבר - שוב מקצים מקום בזכרון ואומרים שעכשיו app מצביע לinstance אחר של Apple. הכתובת שהייתה ב-app קודם לכן אפשר לומר שהיא הלכה פייפן. אם כן, הגענו למצב שבו יש שני אובייקטים שתופסים מקום בזכרון, אבל רק לאחד מהם יש לנו פוינטר כלשהו, ולכן אין לנו דרך להגיע או להשתמש יותר באובייקט הישן. כתוצאה מכך, האובייקט הישן יתפנה ל-Garbage Collection. מקווה שהכל מובן
 

דונג

New member
RegisterClientScriptBlock - מעניין:

קראתי קצת על האופציה הנ"ל, שמאפשרת "רישום" סקריפט והפעלתו בצורה יזומה ע"מ השרת. הדוגמא ב MSDN לא ברורה לי... :
<html> <head> <script language="C#" runat="server"> public void Page_Load(Object sender, EventArgs e) { // Form the script that is to be registered at client side. String scriptString = "<script language=JavaScript> function DoClick() {"; scriptString += "myForm.show.value='Welcome to Microsoft .NET'}<"; scriptString += "/"; scriptString += "script>"; if(!this.IsClientScriptBlockRegistered("clientScript")) this.RegisterClientScriptBlock("clientScript", scriptString); } </script> </head> <body topmargin="20" leftmargin="10"> <form id="myForm" runat="server"> <input type="text" id="show" style="width=200"> <input type="button" value="ClickMe" onclick="DoClick()"> </form> </body> </html>​
מציגים לי קובץ HTML, אשר בחלק ה Head שלו כתוב סקריפט, שבתוכו כתובה פונקצית צד שרת ? (Page Load), ובתוכה כתוב קוד #C - שוב, צד שרת... ע"ם מה שהבנתי, אני אמור לכתוב את הסקריפט לתוך משתנה Script/String, ואז לבצע עבורו RegisterClientScriptBlock עם מפתח מזהה, וכאשר בתוך פרוצדורת צד שרת ארצה לבצע את הסקריפט, פשוט אקרא לו ע"י המפתח המזהה שלו. מה בדיוק הולך בדוגמא שצירפתי ? היא בלבלה אותי לגמרי... :) :)
 

nattygur

New member
הרעיון מאחורי RegisterClientScript

הוא יצירת Script שירוץ בתחנה מהשרת. האופציה הזאת מאפשרת שליטה מהקוד בשרת מה יתרחש בתחנה. הדוגמה מפיקה Script לתחנה עם פרוצדורה אשר תקרא כאשר המשתמש יקליק על ה TextBox. המזהה של ה Script מאפשר בדיקה אם הקוד כבר הופק. בקיצור זאת אפשרות להפיק קוד שירוץ בתחנה ולא בשרת. דרך אגב ישנה עוד פונקציה שימושית בשם RegisterStartUpScript שהיא מוסיפה את ה Script מיד אחרי ה Form ה HTMLלי ובכך גורמת לביצוע הקוד איך שהדף עולה.
 

דונג

New member
את המטרה של הפקודה הבנתי..

לא ממש הבנתי את הסלט שהם עשו בדוגמא... או שאלה יותר כללית : אני רוצה יצור סקריפט של הקפצת הודעה למשתמש "alert". היכן אני כותב את הסקריפט עצמו והיכן את הרישום שלו ?
 

gilad g

New member
תגית <script runat=server>

אומרת שהקוד הנ"ל ירוץ בצד שרת, בדיוק כמו CodeBehind
 

דונג

New member
OK, אבל מה המשמעות כשאתה כותב

אותו ב HEAD של מסמך HTML... ? בכל מקרה, אני מעוניין ליצור את האופציה שבו מתוך קוד ה ASPX, קרי : צד שרת, אוכל להקפיץ הודעת IE למשתמש. ע"פ מה שהבנתי, עלי לכתוב את הסקריפט הקצר (המקפיץ ALERT) לתוך משתנה STRING, או SCRIPT, לעשות לסקריפט הזה REGISTER ע"י הפקודה שבכותרת, ואז, מתי שארצה, אותה להפעיל אותו מתוך קוד שד שרת. הבעיה היא שאני לא יודע היכן לייצר את משתנה ה STRING/SCRIPT... אשמח אם מישהו יותר להסביר בפירוט, דוגמא בכלל תהיה מצויינת :) תודה !!!
 

gilad g

New member
../images/Emo35.gif

"OK, אבל מה המשמעות כשאתה כותב אותו ב HEAD של מסמך HTML...?" לעומת מה? פשוט כתוב את הפקודה הבאה:
RegisterClientScriptBlock("myScript","<script language=javascript">alert('hello!')</script>");​
 

דונג

New member
את זה הבנתי... אבל...

הפקודה שכתבת, "רושמת" את הסקריפט עם המפתח שציינת (myScript), אבל איפה שאני כותב את הפקודה RegisterClientScriptBlock ? אני לא יכולל כתוב אותה בקובץ ה HTML, כי זו לא פקודת HTML... היכן בדיוק אני כותב אותה ? ב Page Load (למשל) בקובץ ה aspx ?
 

דונג

New member
תודה רבה !!! שאלות אחרונות בבקשה:

1. עדיף ב PreREnder באופן כללי, ע"מ שהסקריפט יעבוד גם אם אני מעוניין להריץ אותו לפני שהאובייקטים מצויירים על המסך, אם לא, אז לא חובה.. אמת ? 2.הפונקציה Page Load כתובה לי אוטומטית, כיצד אני מייצר אוטומטית את הארוע Pre Render של המסך ? 3. הבנתי שלפני רישום הסריפט, עלי לבדוק הם הוא אינו רשום (בעליה נוסת של המסך, למשל) - אם לא אעשה זאת, המסך יעף, או שהוא יתעלם כך ? 4. לחר שכתבתי את הקוד ב Pre Render, נניח שמתוך ארוע לחיצה על כפתור, והטיפול בו בצד השרת, אני רוצה להפעיל את הסקריפט שרשמתי, כיצד אני קורא לו ?
 

דונג

New member
מישהו בבקשה..../images/Emo77.gif../images/Emo24.gif../images/Emo141.gif../images/Emo45.gif

 

gilad g

New member
אני חושש שאתה

טיפה לא מבין מה בדיוק הולך, ואת מודל השרת לקוח, אז נסביר לך קצת
סדר האירועים הוא כזה:
הלקוח מבקש מהשרת דף כלשהו.
השרת מעבד את הדף, כולל את הקוד שבו, מריץ את כל האירועים הנדרשים (כלומר OnLoad, OnInit, וכו'), ואז שולח פלט ללקוח.
הלקוח מקבל את הפלט (HTML בסיסי, לפעמים עם קוד Javascript), מעבד אותו, ומציג אותו למשתמש. אם יש קוד JS, הוא גם מבצע אותו. שים לב, שהקוד של צד הלקוח, תמיד יתבצע לאחר הקוד של השרת, ולכן כל מה שהשרת יכול לעשות זה RegisterClientScriptBlock, כלומר "תוסיף לפלט של הדף, את הסקריפט הבא, והלקוח (כלומר הדפדפן) כבר יטפל בזה. עכשיו נענה לך על השאלות: 1. כמו שאמרתי, PreRender תציד רץ לפני שהלקוח בכלל מקבל את ה-HTML שלו, בגלל שזה אירוע צד שרת. 2. הממ..:
protected override void OnPreRender(EventArgs e) { base.OnPreRender(e); }​
3. לא יודע, שווה לבדוק
4. אתה לא יכול לקרוא לו מצד שרת -- המקסימום שאתה יכול לעשות זה RegisterClientScriptBlock, שיאמר ללקוח להפעיל סקריפט מסוים.
 

nattygur

New member
שאלה והבהרה

גלעד, למה preRender עדיף ? 2) Page_Load זה אירוע שסביבת הפיתוח מוסיפה את הקוד הנדרש. לעומתו PreRender הוא מתודה של אובייקט בסיס שנדרש לעשות לה Override, בדיוק כמו שגלעד עשה. 3) תיתרחש רק המתודה שנקראה ראשונה, אחרות פשוט לא יבוצעו.
 

gilad g

New member
זוהי ההמלצה של Microsoft,

וזה גם די הגיוני, כי PreRender מתבצע ממש לפני שליחת הדף ללקוח, אחרי שביצענו את כל הפעולות. והדבר היחידי ש-RegisterClientScriptBlock (וואו איזה שם ארוך...
) יכול להשפיע עליו זה הלקוח. אפשר לשים את זה ב-Load, אבל זה פשוט נראה לי פחות הגיוני
 

דונג

New member
אויי וואבוי... ../images/Emo13.gif../images/Emo24.gif../images/Emo35.gif../images/Emo46.gif../images/Emo140.gif

תודה רבה על ההסבר המפורט, למרות שאת העקרונות אני מכיר.. :) שוב תודה. 2 דברים עקריים נותרו, שלא הבנתי : 1. אני יודע שאני יכול לכתוב את קוד השלד של הפונקציה OnPreRender, פשוט הכתוונתי בשאלתי האם יש דרך להוסיף אותה אוטומטית כמו Page Load. האם יש ? או שאני צריך לכתוב את השלד בעצמי ? 2. הבנתי מה RegisterClientScriptBlock עושה, הוא פשוט מוסיף קוד סקריפט לדף ה HTML הנשלח ללקוח מה IIS, אבל חשבתי שכל המטרה היא שאני אוכל להשתמש ולקרוא לסקריפט הזה מתוך קוד צד שרת... לדוגמא : כאשר המשתמש לוחץ על כפתור במסך, EVENT ה OnClick שלו נקרא, שם אני מתחבר ל DB, מכניס רשומות, מעדכן וכו' וכו', בסיום התהליך אני רוצה להוציא הודעה למשתמש, ע"י הודעה של IE (ולא טקסט על המסך). חשבתי לעשותז את ע"י סקריפט שיקבל פרמטר ויוציא alert, לצורך כך עלי להכיר לשרת את הסקריפט,ואת זה אעשה ע"י RegisterClientScriptBlock, וחשבתי שכשארה להוציא את ההודעה, אשתמש בפונקציה אחרת אשר יודעת לקבל את מפתח הסקריפט שבו השתמשתי לרישומו, ולהריץ אותו. כעת אתה טוען שזה לא עובד כך ? כיצד אוציא למשתמש הודעה IE ? קרי, alert של JS ? תודה !!!
 
למעלה