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");
}
}
לא מתוחכם מידי, אבל מאוד עזר לי :-)