ASP.NET UpdatePanel 的错误处理自定义






3.50/5 (5投票s)
如何自定义 UpdatePanel 客户端错误,以便呈现给用户。
引言
当在 UpdatePanel
控件中进行部分页面更新时发生错误(应用程序内部错误或丢失服务器连接)时,默认行为是在浏览器中显示一个包含错误消息的消息框,例如:
可以自定义此行为,并向用户提供更多详细信息,或者以页面内的错误面板的形式显示错误,而不是使用消息框。
Using the Code
在附带的项目中,我创建了一个包含 ScriptManager
和 UpdatePanel
的示例页面,其中包含一个单击时会引发异常的 Button
。
如果选中了 CheckBox
,将启用自定义错误处理的客户端脚本,因此你可以看到自定义行为,它会显示一个带有自定义消息的弹出窗口,并将错误消息重定向到页面内的错误面板。否则,你可以看到浏览器默认行为,它将显示浏览器消息框。要使用它,请打开项目并无调试状态启动 (Ctrl+F5)。
这是处理 UpdatePanel
错误所需的 JavaScript
...
<script type="text/javascript">
function EndRequestHandler(sender, args) {
//if UpdatePanel error occurs...
if (args.get_error() != undefined) {
var Error = "3-add further description client side... : [Code]:" +
args.get_response().get_statusCode() + " [Message]: " +
args.get_error().message;
//Show your custom popup or...
alert(Error);
//Hide default ajax error popup
args.set_errorHandled(true);
//...redirect error to your Error Panel on page
document.getElementById("Label1").innerText = Error;
}
}
</script>
...
<script type="text/javascript">
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);
</script>
但是,我只想在选中复选框时才将其添加到页面,因此我从代码隐藏文件中执行此操作。
if (CheckBox1.Checked)
{
if (!Page.ClientScript.IsClientScriptBlockRegistered("EndRequestHandler"))
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append("<script type=\"text/javascript\">");
sb.Append("function EndRequestHandler(sender, args) {");
sb.Append("if (args.get_error() != undefined) {");
sb.Append(
"var Error = \"3-add further description client side... : [Code]:\" +
args.get_response().get_statusCode() + \" [Message]: \" +
args.get_error().message;");
//Show your custom popup or...
sb.Append("alert(Error);");
//Hide default ajax error popup
sb.Append("args.set_errorHandled(true);");
//...redirect error to your Error Panel on page
sb.Append("document.getElementById(\"Label1\").innerText = Error;");
sb.Append("}");
sb.Append("}");
sb.Append("</script>");
Page.ClientScript.RegisterClientScriptBlock(this.GetType(),
"EndRequestHandler", sb.ToString(), false);
}
if (!Page.ClientScript.IsStartupScriptRegistered("AddEndRequestHandler"))
{
System.Text.StringBuilder sb2 = new System.Text.StringBuilder();
sb2.Append("<script type=\"text/javascript\">");
sb2.Append(
"Sys.WebForms.PageRequestManager.getInstance().add_endRequest(
EndRequestHandler);");
sb2.Append("</script>");
Page.ClientScript.RegisterStartupScript(this.GetType(),
"AddEndRequestHandler", sb2.ToString(), false);
}
}
关注点
当发生异常时,错误消息将从异常的源头开始连接(在我们的例子中为“1-内部错误...”),然后通过 ScriptManager1_AsyncPostBackError
,因此你可以添加进一步的描述以显示给客户端。
protected void Button1_Click(object sender, EventArgs e)
{
throw new Exception("1-Internal Error...");
}
protected void ScriptManager1_AsyncPostBackError(object sender,
AsyncPostBackErrorEventArgs e)
{
//2- Add further description to e.Exception.Message that contains
//"1-Internal Error..."
ScriptManager1.AsyncPostBackErrorMessage = e.Exception.Message +
" 2-add further description server side...";
//now message error is "1-Internal Error... 2-add further description
//server side..."
}
如果未管理客户端错误处理,将按原样显示此消息:“1-内部错误... 2-服务器端添加进一步的描述...”;否则,你可以使用脚本添加进一步的描述
...
var Error = "3-add further description client side... : [Code]:" +
args.get_response().get_statusCode() + " [Message]: " +
args.get_error().message;
...
然后使用警报显示它,或重定向到页面控件,输出将是:
以下是 Web 服务器状态代码定义(1xx 到 5xx)的列表,这些代码通常发生在内部应用程序错误中:10 状态代码定义。
以下是 WinInet 函数返回的网络错误代码列表(12001 到 12156),这些代码通常发生在无法访问 Web 服务器时:信息:WinInet 错误代码 (12001 到 12156)。