我正在维护一个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() ); } } }
答案 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中触发事件的方式