1

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

by 刘武 25. 七月 2009 11:11

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


<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客户端页面周期事件及实践:客户端验证

Tags: ,

技术生涯

评论

Galatee
Galatee
2009-8-28 16:44:27 回复

我們不能避免在系統異常,但我們必須避免刪除用戶的信息。您的意見,最好是讓我非常感動。

添加评论


(将显示你的Gravatar图标)

biuquote
  • 评论
  • 在线预览
Loading



Powered by BlogEngine.NET 1.6.1.9  登录
Original Design by Laptop Geek, Adapted by onesoft