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);
}
相关阅读: