【问题标题】:ASP.NET Jquery C# MessageBox.Show dialog uh...issueASP.NET Jquery C# MessageBox.Show 对话框呃...问题
【发布时间】: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,并获得所需的结果...

标签: c# asp.net jquery dialog messagebox


【解决方案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";
    
    }
    

    【讨论】:

    • 这似乎有效。我不得不稍微调整一下我的代码,并弄清楚如何重新连接确定/确认按钮,但是服务器端的警报/确认似乎正在工作......将不得不更多地敲击它。但谢谢你让我几乎一路走来。 :)
    猜你喜欢
    • 2011-05-28
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多