2010-06-29 83 views
0

我正在維護一個ASP.NET站點,並且我試圖使用jQuery更好地查看對話框。該Web應用程序有一個名爲MessageBox的C#類,它允許從服務器端向客戶端顯示消息....實質上在C#上的aspx代碼隱藏中,如果某些邏輯'不計算',則可以只是MessageBox.Show '你的錯誤信息');ASP.NET Jquery C#MessageBox.Show對話框呃...問題

由於MessageBox類似乎只是「注入」的javascript ......「警戒(郵件)」我試圖改變的JavaScript的jQuery的對話框呼叫:

HTML:標準的jQuery例子對話框.. (特意切斷標籤......只是爲了讓代碼示例顯示出來...在這裏可能有一種真正的方法...但這是我的第一篇文章...)

 
div id="dialog" title="Example dialog"> 
p>Some text that you want to display to the user./p> 
/div> 

jQuery: 我註釋掉Alert,並替換爲: sb.Append(「$('dialog')。dialog('open');」);

 
while(iMsgCount-- > 0) 
{ 
    sMsg = (string) queue.Dequeue(); 
    sMsg = sMsg.Replace("\n", "\\n"); 
    sMsg = sMsg.Replace("\"", "'"); 
    //sb.Append(@"alert(""" + sMsg + @""");"); 

    **** sb.Append("$('dialog').dialog('open');"); **** 
} 

我期待這個打開在html中設置的對話框,但沒有顯示。 我想javascript是JavaScript ...而是執行,而不是一個jQuery調用手動警報無所謂......但顯然有一個斷開連接。

有關如何解決此問題的任何想法?或者我沒有意識到的任何更好的實現?

謝謝,對於任何和所有的幫助...我已經在下面包括完整的MessageBox類。

Curt。

 
public class MessageBox 
{ 
    private static Hashtable m_executingPages = new Hashtable(); 

private MessageBox(){} 

    public static void Show(string sMessage) 
    { 
     if(!m_executingPages.Contains(HttpContext.Current.Handler)) 
     { 
      Page executingPage = HttpContext.Current.Handler as Page; 
      if(executingPage != null) 
      { 
      Queue messageQueue = new Queue(); 
      messageQueue.Enqueue(sMessage); 
      m_executingPages.Add(HttpContext.Current.Handler, messageQueue); 
      executingPage.Unload += new EventHandler(ExecutingPage_Unload); 
      } 
     } 
     else 
     { 
      Queue queue = (Queue) m_executingPages[ HttpContext.Current.Handler ]; 
      queue.Enqueue(sMessage); 
     } 
    } 

    private static void ExecutingPage_Unload(object sender, EventArgs e) 
    { 
     Queue queue = (Queue) m_executingPages[ HttpContext.Current.Handler ]; 
     if(queue != null) 
     { 
      StringBuilder sb = new StringBuilder(); 
      int iMsgCount = queue.Count; 
      sb.Append(""); 
      string sMsg; 
      while(iMsgCount-- > 0) 
      { 
      sMsg = (string) queue.Dequeue(); 
      sMsg = sMsg.Replace("\n", "\\n"); 
      sMsg = sMsg.Replace("\"", "'"); 
      sb.Append(@"alert(""" + sMsg + @""");"); 
      } 

      sb.Append(@""); 
      m_executingPages.Remove(HttpContext.Current.Handler); 
      HttpContext.Current.Response.Write(sb.ToString()); 
     } 
    } 
} 
+0

是否與'alert'工作? – SLaks 2010-06-29 21:49:03

+0

是的,MessageBox類的工作原理與簡單的醇'警報,因此我希望我只能切換一些JavaScript周圍,並得到所需的結果... – Curt 2010-06-29 22:10:53

回答

3

這是奇怪的......我寫了一個幾乎和很久以前完全相同的類。一秒鐘我以爲你在用它!無論如何,我挖掘了我的代碼。我用了很多。它允許您指定一個「回調」函數名稱,以防您不想使用「警報」功能。

順便說一句,你需要小心靜態哈希表。如果您有多個人同時使用該應用,他們可能會收到對方的消息。

用法:

<webapp:MessageBox ID="messageBox" Callback="showMessage" runat="server" /> 
<script type="text/javascript"> 
    function showMessage(messages) { 
     $("#dialog p").empty(); 
     for(var msg in messages) { 
      $("#dialog p").html += msg; 
     } 
     $("#dialog p").show(); 
    } 
</script> 

我沒有測試回調腳本,但你的想法。

,代碼:

/// <summary> 
/// MessageBox is a class that allows a developer to enqueue messages to be 
/// displayed to the user on the client side, when the page next loads 
/// </summary> 
public class MessageBox : System.Web.UI.UserControl 
{ 

    /// <summary> 
    /// queues up a message to be displayed on the next rendering. 
    /// </summary> 
    public static void Show(string message) 
    { 
     Messages.Enqueue(message); 
    } 

    /// <summary> 
    /// queues up a message to be displayed on the next rendering. 
    /// </summary> 
    public static void Show(string message, params object[] args) 
    { 
     Show(string.Format(message, args)); 
    } 

    /// <summary> 
    /// override of OnPreRender to render any items in the queue as javascript 
    /// </summary> 
    protected override void OnPreRender(EventArgs e) 
    { 
     base.OnPreRender(e); 

     if (Messages.Count > 0) 
     { 

      StringBuilder script = new StringBuilder(); 
      int count = 0; 

      script.AppendLine("var messages = new Array();"); 

      while (Messages.Count > 0) 
      { 
       string text = Messages.Dequeue(); 
       text = text.Replace("\\", "\\\\"); 
       text = text.Replace("\'", "\\\'"); 
       text = text.Replace("\r", "\\r"); 
       text = text.Replace("\n", "\\n"); 

       script.AppendFormat("messages[{0}] = '{1}';{2}", count++, HttpUtility.HtmlEncode(text), Environment.NewLine); 
      } 

      if (string.IsNullOrEmpty(Callback)) 
      { 
       // display as "alert"s if callback is not specified 
       script.AppendFormat("for(i=0;i<messages.length;i++) alert(messages[i]);{0}", Environment.NewLine); 
      } 
      else 
      { 
       // call the callback if specified 
       script.AppendFormat("{0}(messages);{1}", Callback, Environment.NewLine); 
      } 

      Page.ClientScript.RegisterStartupScript(this.GetType(), "messages", script.ToString(), true); 
     } 
    } 

    /// <summary> 
    /// gets or sets the name of the javascript method to call to display the messages 
    /// </summary> 
    public string Callback 
    { 
     get { return callback; } 
     set { callback = value; } 
    } 
    private string callback; 

    /// <summary> 
    /// helper to expose the queue in the session 
    /// </summary> 
    private static Queue<string> Messages 
    { 
     get 
     { 
      Queue<string> messages = (Queue<string>)HttpContext.Current.Session[MessageQueue]; 
      if (messages == null) 
      { 
       messages = new Queue<string>(); 
       HttpContext.Current.Session[MessageQueue] = messages; 
      } 
      return messages; 
     } 
    } 
    private static string MessageQueue = "MessageQueue"; 

} 
+0

這似乎工作。我不得不調整我的代碼,並找出如何重新連接確認/確認按鈕,但服務器端警報/確認似乎正在工作......將不得不再次轟炸。但是謝謝你讓我幾乎在那裏。 :) – Curt 2010-07-06 19:57:48

0

將散發的Javascript包裝在$(function() { ... })中。

+0

謝謝你的建議...我給了這一槍,不幸的是, ,它似乎沒有工作,還有其他想法? – Curt 2010-06-29 22:08:46

+0

你是否收到任何腳本錯誤? – SLaks 2010-06-29 22:19:18

0

「Unload()事件在頁面完全呈現,發送到客戶端並準備好丟棄後引發。此時,Response()和Request()等頁面屬性被卸載並且進行清理。「 http://msdn.microsoft.com/en-us/library/ms178472.aspx

您必須在頁面呈現過程中添加輸出,而不是在Unload事件中添加輸出。

在閱讀上面的內容,它與「alert」一起工作後,我會說我的答案不會有幫助。然而,我會說奇怪的是,它確實有效,因爲它不應該讓事件在asp.net中被解僱。