我在页面中覆盖了OnError
方法:
public string script;
protected override void OnError(EventArgs e)
{
script = "alert('error');";
}
在aspx中,我有这个:
<script type="text/javascript">
$(document).ready(function(){
<%=script %>;
});
</script>
我正在模拟Page_Load
中的错误,但它没有触发警报。如果我将代码从OnError
切换为OnLoad
,则效果很好。
思想?
答案 0 :(得分:1)
当您覆盖OnError
时,您需要清除错误,以便将其标记为已处理,如果您不这样做,那么它会冒出Application_Error
,从而删除您网页上的任何内容已经渲染..
protected override void OnError(EventArgs e)
{
script = "alert('error');";
Server.ClearError(); //Prevent the error from propagating
}
看着反射器你可以看到这个..
try
{
this.Context.TempError = e;
this.OnError(EventArgs.Empty);
if (this.Context.TempError == null)
{
return true;
}
}
finally
{
this.Context.TempError = null;
}
Server.ClearError
清除TempError
public void ClearError()
{
if (this._tempError != null)
{
this._tempError = null;
}
...other code..
}
答案 1 :(得分:0)
因为页面没有错误,因此没有触发OnError事件。
或者您是否强制错误并且警报仍未显示?
顺便说一下,取出脚本插入中的标签,然后发出警告 - 你已经在ASPX中定义了。
<强>更新强>:
可能与调用层次结构有关,在OnError发生之前调用document.ready()。
尝试将整个内容放入文字中,例如:
<asp:Literal runat="server" ID="JScript" />
protected override void OnError(EventArgs e)
{
JScript.Text = "<script type=\"text/javascript\">alert('error');</script>";
}
答案 2 :(得分:0)
您正在做的事情会在输出页面中生成如下代码:
<script type="text/javascript">
$(document).ready(function(){
<script language='javascript' type='text/javascript'>alert('error')</script>;
});
</script>
这显然是错误的。您需要将script
变量更改为:
script = @"alert('error')";
答案 3 :(得分:0)
你抛出一个Exception
并且没有在try / catch页面中处理它的事实意味着页面永远不会完成渲染。您不仅没有获得script
字符串的输出,而且由于页面未呈现,您可能会发现您没有收到$(document).ready()
或其他任何内容。
如果您处理此类异常,则页面呈现将完成,您的消息将显示。
try
{
throw new Exception();
}
catch(Exception ex)
{
// log ex.ToString() here
script = "alert('error')";
// decide what to do here - carry on or return
}
实际上,您应该尽量避免捕获Exception
,始终尝试预测您期望的特定异常并相应地处理它们。实际上,总是尽量避免首先抛出异常的情况 - 在特殊情况下应该抛出异常。
阅读this CodeProject article,其中讨论了有关异常处理的一些最佳做法。