2013-06-06 99 views
1

下面是我的WebMsgBox類。我用它來打印一些消息。點擊ok按鈕後,做頁面重定向

using System; 
using Microsoft.VisualBasic; 
using System.Text; 
using System.Collections; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

/// <summary> 
/// Summary description for WebMsgBox 
/// </summary> 

public class WebMsgBox 
{ 

    protected static Hashtable handlerPages = new Hashtable(); 

    private WebMsgBox() 
    { 

    } 



    public static void Show(string Message) 
    { 

     if (!(handlerPages.Contains(HttpContext.Current.Handler))) 
     { 

      Page currentPage = (Page)HttpContext.Current.Handler; 

      if (!((currentPage == null))) 
      { 

       Queue messageQueue = new Queue(); 

       messageQueue.Enqueue(Message); 

       handlerPages.Add(HttpContext.Current.Handler, messageQueue); 

       currentPage.Unload += new EventHandler(CurrentPageUnload); 

      } 

     } 

     else 
     { 

      Queue queue = ((Queue)(handlerPages[HttpContext.Current.Handler])); 

      queue.Enqueue(Message); 

     } 

    } 



    private static void CurrentPageUnload(object sender, EventArgs e) 
    { 

     Queue queue = ((Queue)(handlerPages[HttpContext.Current.Handler])); 

     if (queue != null) 
     { 

      StringBuilder builder = new StringBuilder(); 

      int iMsgCount = queue.Count; 

      builder.Append("<script language='javascript'>"); 

      string sMsg; 

      while ((iMsgCount > 0)) 
      { 

       iMsgCount = iMsgCount - 1; 

       sMsg = System.Convert.ToString(queue.Dequeue()); 

       sMsg = sMsg.Replace("\"", "'"); 

       builder.Append("alert(\"" + sMsg + "\");"); 

      } 

      builder.Append("</script>"); 

      handlerPages.Remove(HttpContext.Current.Handler); 

      HttpContext.Current.Response.Write(builder.ToString()); 

     } 

    } 

} 

,當我使用這個類的方法顯示類似下面

WebMsgBox.Show("some message"); 

它工作正常,但是當我做財產以後像下面

WebMsgBox.Show("some message"); 
Response.Redirect("myform.aspx"); 

則不會顯示該消息。我需要它,就像這段代碼執行時一樣,首先顯示消息,之後點擊ok按鈕(位於消息框中),然後它應該重定向到myform.aspx。

我不想改變,這個類的代碼,B'Cos我使用這個類的很多形式,我不能改變這個類的代碼只是一種形式。

我該怎麼做。

+0

您需要使用window.location做重定向客戶端。服務器端重定向不會將任何生成的html發送到瀏覽器,它只會發送303狀態。 –

回答

0

你必須重定向客戶端:

builder.Append("alert(\"" + sMsg + "\");"); 
    builder.Append("window.location = 'myform.aspx';"); 

的Response.Redirect沒有顯示它重定向你的頁面!

+0

我使用這個類的很多形式,我不能只爲一種形式改變這個類的代碼。其他解決方案? – Gaurav

+0

您可能會添加一個可選的paramiter到您的函數 –

0

您可以添加一個可選的paramiter給你的函數

using System; 
using Microsoft.VisualBasic; 
using System.Text; 
using System.Collections; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

/// <summary> 
/// Summary description for WebMsgBox 
/// </summary> 

public class WebMsgBox 
{ 

    protected static Hashtable handlerPages = new Hashtable(); 

    protected static string redirectUrl = ""; 

    private WebMsgBox() 
    { 

    } 


    public static void Show(string Message, string redirectUrl = "") 
    { 

     if (!(handlerPages.Contains(HttpContext.Current.Handler))) 
     { 

      Page currentPage = (Page)HttpContext.Current.Handler; 

      if (!((currentPage == null))) 
      { 
       if (!string.IsNullOrWhiteSpace(redirectUrl)) 
        WebMsgBox.redirectUrl = redirectUrl; 

       Queue messageQueue = new Queue(); 

       messageQueue.Enqueue(Message); 

       handlerPages.Add(HttpContext.Current.Handler, messageQueue); 

       currentPage.Unload += new EventHandler(CurrentPageUnload); 

      } 

     } 

     else 
     { 

      Queue queue = ((Queue)(handlerPages[HttpContext.Current.Handler])); 

      queue.Enqueue(Message); 

     } 

    } 



    private static void CurrentPageUnload(object sender, EventArgs e) 
    { 

     Queue queue = ((Queue)(handlerPages[HttpContext.Current.Handler])); 

     if (queue != null) 
     { 

      StringBuilder builder = new StringBuilder(); 

      int iMsgCount = queue.Count; 

      builder.Append("<script language='javascript'>"); 

      string sMsg; 

      while ((iMsgCount > 0)) 
      { 

       iMsgCount = iMsgCount - 1; 

       sMsg = System.Convert.ToString(queue.Dequeue()); 

       sMsg = sMsg.Replace("\"", "'"); 

       builder.Append("alert(\"" + sMsg + "\");"); 

      } 

      if (!string.IsNullOrWhiteSpace(WebMsgBox.redirectUrl)) 
      { 
       builder.Append("window.location = '" + WebMsgBox.redirectUrl + "'"); 
       WebMsgBox.redirectUrl = ""; 
      } 

      builder.Append("</script>"); 

      handlerPages.Remove(HttpContext.Current.Handler); 

      HttpContext.Current.Response.Write(builder.ToString()); 

     } 

    } 

} 
+0

顯示錯誤「默認參數說明符不允許」 – Gaurav

+1

如果它將用於不同的頁面,您認爲將它聲明爲靜態是個好主意嗎? –

+0

@AlexFilipovici你是對的!應該設置爲空,一旦頁面被卸載 –

0

添加到您的類:

protected static Hashtable contexts = new Hashtable(); 

更改Show方法的定義:

public static void Show(string Message, string redirect) 
{ 
    // ... 
    messageQueue.Enqueue(Message); 

    handlerPages.Add(HttpContext.Current.Handler, messageQueue); 
    contexts.Add(HttpContext.Current.Handler, redirect); // add this line 

    currentPage.Unload += new EventHandler(CurrentPageUnload); 
    // ... 
} 

更改CurrentPageUnload

string redirect= contexts[HttpContext.Current.Handler].ToString(); // add this line 
// ... 
builder.Append("alert(\"" + sMsg + "\");"); 
builder.Append("window.location = '" + redirect + "';"); // add this line 

這樣稱呼它:

WebMsgBox.Show("some message","myform.aspx"); 
+0

名稱'messageQueue'不存在於當前的 – Gaurav

+0

我的意思是你應該添加一行到當前內容。通過'// ...'我打算告訴你,你應該保留前面的方法內容,只需添加'contexts.Add(HttpContext.Current.Handler,redirect);'行。 –

0

JavaScript警告功能有當您單擊確定按鈕,將被執行沒有回調函數。您要麼從Javascript本身重定向,並在警報消息之後立即添加以下代碼。

window.location = 'yourform.aspx"'; 

OR

可以使用Jquery UI dialog,其上單擊按鈕執行代碼。您也可以查看jAlert plugin,這是現在存檔,但您可以使用修改後的版本here

0

我也想這樣做。我嘗試過不同的方法,但都沒有工作。 這裏是解決方案,爲我工作100%。

Server.Transfer("yourPageName.aspx"); 
相關問題