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

Posted

技术标签:

【中文标题】ASP.NET Jquery C# MessageBox.Show 对话框呃...问题【英文标题】:ASP.NET Jquery C# MessageBox.Show dialog uh...issue 【发布时间】:2011-03-09 20:46:01 【问题描述】:

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

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

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

div id="dialog" title="示例对话框"> p>一些你想显示给用户的文本。/p> /div>

jQuery: 我注释掉了警报,并替换为: sb.Append("$('dialog').dialog('open');");

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

简陋。

公共类消息框 私有静态哈希表 m_executingPages = new Hashtable(); 私有 MessageBox() 公共静态无效显示(字符串 sMessage) 如果(!m_executingPages.Contains(HttpContext.Current.Handler)) Page executionPage = HttpContext.Current.Handler as Page; 如果(执行页面!= null) 队列 messageQueue = new Queue(); messageQueue.Enqueue(sMessage); m_executingPages.Add(HttpContext.Current.Handler, messageQueue); executionPage.Unload += new EventHandler(ExecutingPage_Unload); 别的 队列 queue = (Queue) m_executingPages[ HttpContext.Current.Handler ]; queue.Enqueue(sMessage); private static void ExecutingPage_Unload(object sender, EventArgs e) 队列 queue = (Queue) m_executingPages[ HttpContext.Current.Handler ]; 如果(队列!= null) StringBuilder sb = new StringBuilder(); int iMsgCount = queue.Count; sb.Append(""); 字符串短信; 而(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());

【问题讨论】:

是的,MessageBox 类只适用于普通的 ol' 警报,因此我希望我可以切换一些 javascript,并获得所需的结果... 【参考方案1】:

将发出的 Javascript 包装在 $(function() ... ) 中。

【讨论】:

感谢您的建议...我试了一下,不幸的是,它似乎不起作用,还有其他想法吗?【参考方案2】:

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

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

在阅读了上面的“警报”后,我想说我的回答没有帮助。但是我会说它确实有效,这很奇怪,因为它不应该给出在 asp.net 中触发事件的方式

【讨论】:

【参考方案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";


【讨论】:

这似乎有效。我不得不稍微调整一下我的代码,并弄清楚如何重新连接确定/确认按钮,但是服务器端的警报/确认似乎正在工作......将不得不更多地敲击它。但谢谢你让我几乎一路走来。 :)

以上是关于ASP.NET Jquery C# MessageBox.Show 对话框呃...问题的主要内容,如果未能解决你的问题,请参考以下文章

将数据传递到处理程序的 Jquery ajax 不起作用(Asp.net、C#、Jquery)

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

jquery datepicker和asp.net c#空值

使用 asp.net C# 和 jquery 过滤数据集合

JQuery 折线图的 X 轴在 ASP.NET、C#、SQL Server 中不显示

c# asp.net jQuery AJAX 从 MySQL 获取数据