ASP.NET Jquery C#MessageBox.Show对话框呃...问题

时间:2010-06-29 21:34:47

标签: c# asp.net jquery dialog messagebox

我正在维护一个ASP.NET站点,我试图使用jQuery让对话框更好看。 Web应用程序有一个名为MessageBox的C#类,允许从服务器端向客户端显示消息....基本上在aspx代码隐藏的C#中,如果某些逻辑“不计算”,你可以只使用MessageBox.Show( '你的错误信息');

由于MessageBox类似乎只是'注入'javascript ...“alert(你的消息)”我试着将javascript更改为jquery对话框调用:

html:标准的jQuery示例对话框...(故意切断标签......只是为了让代码示例显示出来......在这里可能有一种真正的方法可以做到这一点......但是这是我的第一篇文章......)

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

jQuery的: 我评论了警报,并取而代之: sb.Append( “$( '对话框')对话框( '开放');”);

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类。

简略的。

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() );
       }
    }
 }

3 个答案:

答案 0 :(得分:3)

这很奇怪......很久以前我写了几乎相同的课程。一秒钟我以为你在使用它!

无论如何,我挖出了我的代码。我已经习惯了很多。它允许您指定“回调”函数名称,以防您不想使用“警报”功能。

顺便说一下,你需要小心静态Hashtable 。如果你有多个人同时使用该应用程序,他们可能会得到彼此的消息。

用法:

<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";

}

答案 1 :(得分:0)

将发出的Javascript包裹在$(function() { ... })

答案 2 :(得分:0)

“Unload()事件在页面完全呈现,发送到客户端并准备好被丢弃之后引发。此时,页面属性如Response()和Request()被卸载并清理执行。“ http://msdn.microsoft.com/en-us/library/ms178472.aspx

您必须在渲染页面期间添加输出,而不是在卸载事件中添加。

在阅读上面的内容之后,它会以“警报”工作,我会说我的答案无济于事。但是我会说奇怪的是它确实有效,因为它不应该给出在asp.net中触发事件的方式