atlas客户端页面周期事件及实践:自定义错误

在系统中异常总是难以避免的,通常我们应该尽量避免将异常信息直接呈现给用户,因为很多情况下这些信息用户是无法理解的。看下面的例子:

<asp:UpdatePanel ID="up" runat="server" UpdateMode="conditional">
    <ContentTemplate>
        <asp:Button ID="btnTest" runat="server" Text="Test"
        OnClick="btnTest_Click" />
    </ContentTemplate>
</asp:UpdatePanel>

protected void btnTest_Click(object sender, EventArgs e)
{
    throw new System.NullReferenceException();       }

该例中直接抛出了一个找不到引用的异常,atlas默认的处理方式是在客户端弹出该异常信息的对话框:

这显然不是我们想要的,

一种处理方式就是修改该提示信息的内容

可以在ScriptManager控件的AsyncPostBackError事件中捕获异常并修改错误的提示信息:

<asp:ScriptManager ID="sm" runat="server"
    OnAsyncPostBackError="sm_AsyncPostBackError">
</asp:ScriptManager>

protected void sm_AsyncPostBackError(object sender,
    AsyncPostBackErrorEventArgs e)
{
    sm.AsyncPostBackErrorMessage = "发生了未知错误,请联系管理员";
}

 

 也许你不想采用弹出框的形式

那么就可以在页面周期中自定义错误处理:添加以下javascript脚本:

<script type="text/javascript" language="javascript">              Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);
function EndRequestHandler(sender, args)
{
    var error = args.get_error();
   if (error != undefined)
   {            
       $get('err').innerHTML =error.message;               }
   args.set_errorHandled(true);
}
</script>
<div id="err"></div>

注意一定要加上args.set_errorHandled(true)表示该错误已经处理,不需要默认的处理方式了。

 

很多情况下这样还不够,在一些表单型的页面往往需要根据错误来设置输入框的焦点,以改善用户体验。

atlas可以在服务端用ScriptManager.GetCurrent(Page).SetFocus()方法设置焦点,但在异常发生时就不 会执行了,因此我们需要自己实现该功能。这时js里的eval函数帮了我们大忙,因为他可以把字符串当作代码来执行,所以我们可以在代码放在异常信息里:

<script type="text/javascript" language="javascript">              Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);
function EndRequestHandler(sender, args)
{
    var error = args.get_error();
   if (error != undefined)
   {            
       eval(error.message);           }
   args.set_errorHandled(true);
}
</script>
<asp:UpdatePanel ID="up" runat="server" UpdateMode="conditional">
    <ContentTemplate>
        <asp:Button ID="btnTest" runat="server" Text="Test"
        OnClick="btnTest_Click" />
        <asp:TextBox ID="txt1" runat="server"></asp:TextBox>
    </ContentTemplate>
</asp:UpdatePanel>

protected void btnTest_Click(object sender, EventArgs e)
{
    string s = "alert('发生了未知错误,请联系管理员');"+
        "$get('"+txt1.ClientID+"').focus()";
    throw new ApplicationException(s);      
}

相关阅读:

  1. atlas客户端页面周期事件及实践:防止重复提交
  2. atlas客户端页面周期事件及实践:客户端验证

你可能感兴趣的:(客户端)