65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.50/5 (5投票s)

2009年1月15日

CPOL

2分钟阅读

viewsIcon

56411

downloadIcon

323

如何自定义 UpdatePanel 客户端错误,以便呈现给用户。

引言

当在 UpdatePanel 控件中进行部分页面更新时发生错误(应用程序内部错误或丢失服务器连接)时,默认行为是在浏览器中显示一个包含错误消息的消息框,例如:

defaultmsgerror1.jpg

可以自定义此行为,并向用户提供更多详细信息,或者以页面内的错误面板的形式显示错误,而不是使用消息框。

Using the Code

在附带的项目中,我创建了一个包含 ScriptManagerUpdatePanel 的示例页面,其中包含一个单击时会引发异常的 Button

如果选中了 CheckBox,将启用自定义错误处理的客户端脚本,因此你可以看到自定义行为,它会显示一个带有自定义消息的弹出窗口,并将错误消息重定向到页面内的错误面板。否则,你可以看到浏览器默认行为,它将显示浏览器消息框。要使用它,请打开项目并无调试状态启动 (Ctrl+F5)。

page.jpg

这是处理 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;
...

然后使用警报显示它,或重定向到页面控件,输出将是:

defaultmsgerror2.jpg

以下是 Web 服务器状态代码定义(1xx 到 5xx)的列表,这些代码通常发生在内部应用程序错误中:10 状态代码定义

以下是 WinInet 函数返回的网络错误代码列表(12001 到 12156),这些代码通常发生在无法访问 Web 服务器时:信息:WinInet 错误代码 (12001 到 12156)

© . All rights reserved.