繁体   English   中英

发生错误时调用JavaScript函数-ASP.NET

[英]Calling a javascript function when an error occurs - ASP.NET

我在页面中重写了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 ,则效果很好。

有什么想法吗?

当您重写OnError ,需要清除错误,以便将其标记为已处理。如果不执行此操作,则它将冒泡到Application_Error ,从而破坏了页面可能呈现的任何内容。

尝试使用Server.ClearError

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..
 }

因为页面没有错误,所以没有引发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>";
        }

您正在执行的操作将在输出页面中生成如下代码:

<script type="text/javascript">
$(document).ready(function(){
   <script language='javascript' type='text/javascript'>alert('error')</script>;
});
</script>

这显然是错误的。 您需要将script变量更改为:

script = @"alert('error')";

您抛出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 ,始终尝试预期会遇到的特定异常并相应地进行处理。 实际上,请始终尽量避免首先抛出异常的情况-在特殊情况下应抛出异常。

通读此CodeProject文章 ,其中讨论了有关异常处理的一些最佳实践。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM