DCSIMG
RegisterClientScriptBlock With Response.Redirect - Tamir Shlomi's Blog

Tamir Shlomi's Blog

Welcome to Tamir Shlomi's blog. All about .NET, OOP and SQL server

RegisterClientScriptBlock With Response.Redirect

 

לפני כמה ימים הייתה לי בעייה:
ביצעתי פעולת עדכון נתוני משתמש ל Data Source, ולאחר בדיקה שהעדכון אכן בוצע, שתלתי js alert שהעדכון אכן בוצע בהצלחה.

הבעיה הייתה שהסקריפט לא הופיע בדף אחרי העדכון, ובדיקה ב view source הראתה שהוא בכלל לא נשתל.

מכיוון שהמערכת שלי מציגה נתוני משתמש לפי ID מה QueryString, לאחר יצירת משתמש חדש הייתי מבצע Response.Redirect ל URL + ה User ID החדש.
מה שהיה קורה, זה שה alert היה נשתל בדף הישן, ואני הייתי נשלח לדף החדש.
אז חשבתי, איך אני יכול לשתול JS alert בדף שאני רוצה לעבור אליו.
פתרתי את הבעייה בעזרת שני פונקציות פשוטות:

הראשונה: יצרתי פונקצייה שמקבלת string message ומשרשרת אותו עם שאר הסינטקס ליצירת ה alert ואחרי שהסקריפט היה מושלם, הכנסתי אותו למשתנה session.

private void CreateSessionBasedJSAlert(string message)
{
     
StringBuilder script = new StringBuilder();
      script
      .Append("<script type=\"text/javascript\">")
      .Append("alert('")
      .Append(message)
      .Append("')</script>");

      Session.Add("JSMessage", script.ToString());
}

לפונקצייה השניה קראתי מידי Page_Load, ופשוט בדקתי אם יש message כלשהוא להצגה:

private void ShowJSAlert()
{
   // Check for messages in the session variable
   string message = (Session["JSMessage"] != null)

              ?Session["JSMessage"].ToString()

  : string.Empty;

   // If there's any message
   if (message.Length > 0)
   {
      // Get the current executing page
      Page page = HttpContext.Current.CurrentHandler as Page; 

      // Check if the handler is a page and the script
      // isn't already on the page
      if (page != null &&
      !page.ClientScript.IsClientScriptBlockRegistered("alert"))
      {
          // plant the script on the page
          page.ClientScript.RegisterClientScriptBlock(
                      this.GetType(), "alert", message);
      }
      // Remove the used script (To avoid duplication of the
      // message every postback)
      Session.Remove("JSMessage");
   }
}

לא מתוחכם מידי, אבל מאוד עזר לי :-)

Comments

Rotem Bloom said:

הפיתרון שלך עובד אבל מאוד לא מומלץ לשתול כזאת מחרוזת ב-SESSION אם כבר הלכת על פיתרון כזה עדיף היה לך להחזיק אינפורמציה קטנה יותר ב-SESSION יענו BOOL שיציין רק אם יש צורך להציג הודעה או לא ושהדף רק יחזליט אם להציג אותה או לא. חבל סתם להחזיק מחרוזת כזאת ארוכה ב-SESSION נראה לי מיותר.

דבר נוסף אם השתמשת ב-RESPONSE.REDIRECT אני מקווה שלא שכחת להשתמש בזה עם FALSE בפרמטר השני.

# July 10, 2008 4:49 PM
Leave a Comment

(required) 

(required) 

(optional)

(required) 


Enter the numbers above: