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#空值