在UpdatePanel控件异步更新时,如果有错误发生,默认情况下会弹出一个Alert对话框显示出错误信息,这对用户来说是不友好的,本文看一下如何在服务端和客户端脚本中自定义异常处理,翻译自官方文档。<?XML:NAMESPACE PREFIX = O />

主要内容

1.在服务端自定义异常处理

2.在客户端脚本中自定义异常处理

一.在服务端自定义异常处理

1.添加ASPX页面并切换到设计视图。

2.在工具箱中AJAX Extensions标签下双击ScriptManager和UpdatePanel控件添加到页面中。

3.在UpdatePanel控件中添加两个TextBox,一个Label,一个Button和一些文字,并设置Button的Text属性值为“Calculate”。

<?XML:NAMESPACE PREFIX = V />

4.双击Calculate按钮并添加如下代码到事件处理中。

protected void Button1_Click(object sender, EventArgs e)
{
    try
    {
        int a = Int32.Parse(TextBox1.Text);

        int b = Int32.Parse(TextBox2.Text);

        int res = a / b;

        Label1.Text = res.ToString();
    }

    catch (Exception ex)
    {
        if (TextBox1.Text.Length > 0 && TextBox2.Text.Length > 0)
        {
            ex.Data["ExtraInfo"] = " You can't divide " +

                TextBox1.Text + " by " + TextBox2.Text + ".";

        }
        throw ex;
    }
}

在事件处理代码中包含了一个try-catch语句块,在try中进行除法运算,如果运算失败,在catch中设置ExtraInfo信息并重新抛出异常。

5.切换到设计视图并选择ScriptManager控件。

6.在属性窗口中的工具栏中,选择事件按钮,并双击AsyncPostBackError。

7.添加如下代码到AsyncPostBackError事件处理。

protected void ScriptManager1_AsyncPostBackError(object sender, AsyncPostBackErrorEventArgs e)
{
    if (e.Exception.Data["ExtraInfo"] != null)
    {
        ScriptManager1. AsyncPostBackErrorMessage =

            e.Exception.Message +

            e.Exception.Data["ExtraInfo"].ToString();

    }
    else
    {       ScriptManager1.AsyncPostBackErrorMessage =

            "An unspecified error occurred.";
    }
}

检测异常的ExtraInfo是否为空,并设置为ScriptManager控件的AsyncPostBackErrorMessage,如果不设置则会创建一个默认的异常。

8.保存并按Ctrl + F5运行。

9.在每一个文本框中输入大于零的数,并单击Calculate按钮提交成功。

10.在第二个文本框中输入0,单击Calculate将会引发一个异常。浏览器将会显示一个对话框,提示的信息为我们在服务端设置的信息。

二.在客户端脚本中自定义异常处理

前面的异常处理是在服务端通过设置ScriptManager控件的属性来进行处理,下面将看一下如何在客户端脚本中使用PageRequestManager类来进行异常处理,并用<div>元素来代替浏览器默认的Alert对话框。

1.在我们前面创建的页面中,切换到代码视图。

2.添加如下的HTML元素到页面中(官方文档中有点错误)

<div id="AlertDiv" language="javascript" onclick="return AlertDiv_onclick()">

    <div id="AlertMessage">

    </div>

    <br />

    <div id="AlertButtons">

        <input id="OKButton" type="button" value="OK" runat="server" onclick="ClearErrorState()" />

    </div>

</div>

3.在HEAD元素中添加如下样式标记。

<style type="text/css">

    #UpdatePanel1 {}{

      width: 200px; height: 50px;

      border: solid 1px gray;

    }

    #AlertDiv{}{

    left: 40%; top: 40%;

    position: absolute; width: 200px;

    padding: 12px; 

    border: #000000 1px solid;

    background-color: white; 

    text-align: left;

    visibility: hidden;

    z-index: 99;

    }

    #AlertButtons{}{

    position: absolute; right: 5%; bottom: 5%;

    }

</style>

4.切换到设计视图并确保你的页面如下所示。

5.在属性窗口中的下拉列表中选择DOCUMENT元素(它对应的是页面<Body>元素),设置Id属性值为bodytag。

6.切换到代码视图。

7.添加如下<script>代码块。

<script type="text/javascript" language="javascript">

var divElem = 'AlertDiv';

var messageElem = 'AlertMessage';

var bodyTag = 'bodytag';

Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);

function ToggleAlertDiv(visString)

{

     if (visString == 'hidden')

     {

         $get(bodyTag).style.backgroundColor = 'white';                         

     }

     else

     {

         $get(bodyTag).style.backgroundColor = 'gray';                         

 

     }

     var adiv = $get(divElem);

     adiv.style.visibility = visString;

 

}

function ClearErrorState() {

     $get(messageElem).innerHTML = '';

     ToggleAlertDiv('hidden');                     

}

function EndRequestHandler(sender, args)

{

   if (args.get_error() != undefined)

   {

       var errorMessage;

       if (args.get_response().get_statusCode() == '200')

       {

           errorMessage = args.get_error().message;

       }

       else

       {

           // Error occurred somewhere other than the server page.

           errorMessage = 'An unspecified error occurred. ';

       }

       args.set_errorHandled(true);

       ToggleAlertDiv('visible');

       $get(messageElem).innerHTML = errorMessage;

   }

}

</script>

在代码块中,主要做以下几件事:

1)定义PageRequestManager类的endRequest事件处理,在事件处理中,当有错误发生时将显示AlertDiv。

2)定义ToggleAlertDiv函数,当有错误发生时它用来显示或者隐藏AlertDiv元素,并且改变页面的背景颜色。

3)定义ClearErrorState函数,它用来隐藏错误信息的UI。

8.保存并按Ctrl + F5运行。

9.在每一个文本框中输入大于零的数,并单击Calculate按钮提交成功。

10.在第二个文本框中输入0,单击Calculate将会引发一个异常。这时自定义的AlertDiv将会显示出来代替了默认的Alert对话框,如下图所示:

[翻译自官方文档]

http://www.cnblogs.com/Terrylee/archive/2006/11/13/Customizing_Error_Handling.html

转载于:https://www.cnblogs.com/wayne-ivan/archive/2007/10/25/937505.html

ASP.NET AJAX入门系列(8):自定义异常处理相关推荐

  1. 【转】ASP.NET AJAX入门系列

    ASP.NET AJAX入门系列将会写关于ASP.NET AJAX一些控件的使用方法以及基础知识,其中部分文章为原创,也有一些文章是直接翻译自官方文档,本部分内容会不断更新. 目录 ASP.NET A ...

  2. ASP.NET AJAX入门系列

    ASP.NET AJAX入门系列将会写关于ASP.NET AJAX一些控件的使用方法以及基础知识,其中部分文章为原创,也有一些文章是直接翻译自官方文档,本部分内容会不断更新. 目录 ASP.NET A ...

  3. ASP.NET AJAX入门系列相关资料收集

    声明:转自TerryLee的blog和自己整理的一些资料下载. ASP.NET AJAX入门系列将会写关于ASP.NET AJAX一些控件的使用方法以及基础知识,其中部分文章为原创,也有一些文章是直接 ...

  4. ASP.NET AJAX入门系列(1):概述

    经常关注我的Blog的朋友可能注意到了,在我Blog的左边系列文章中,已经移除了对Atlas学习手记系列文章的推荐,因为随着ASP.NET AJAX 1.0 Beta版的发布,它们已经不再适用,为了不 ...

  5. ASP.NET AJAX入门系列(2):使用ScriptManager控件

    ScriptManager控件包括在ASP.NET 2.0 AJAX Extensions中,它用来处理页面上的所有组件以及页面局部更新,生成相关的客户端代理脚本以便能够在JavaScript中访问W ...

  6. ASP.NET AJAX入门系列(3):使用ScriptManagerProxy控件

    在ASP.NET AJAX中,由于一个ASPX页面上只能有一个ScriptManager控件,所以在有母版页的情况下,如果需要在Master-Page和Content-Page中需要引入不同的脚本时, ...

  7. ASP.NET AJAX入门系列(10):Timer控件简单使用

    本文主要通过一个简单示例,让Web页面在一定的时间间隔内局部刷新,来学习一下ASP.NET AJAX中的服务端Timer控件的简单使用. 主要内容 Timer控件的简单使用 1.添加新页面并切换到设计 ...

  8. ASP.NET AJAX入门系列(7):使用客户端脚本对UpdateProgress编程

    原文链接:http://www.cnblogs.com/Terrylee/archive/2006/11/12/ASPNET_AJAX_UpdateProgress_Part2.html 在本篇文章中 ...

  9. ASP.NET AJAX入门系列(6):UpdateProgress控件简单介绍

    在ASP.NET AJAX Beta2中,UpdateProgress控件已经从"增值"CTP中移到了ASP.NET AJAX核心中.以下两篇关于UpdateProgress的文章 ...

最新文章

  1. C#设计模式(7)——适配器模式(Adapter Pattern)
  2. 单片机ad转换测电压c语言,大家帮我看下这个STC AD转换 测电压程序错在哪里,谢谢了...
  3. 美国物理超级计算机,美国科学家在物理学的一个分支领域朝着开发超级计算机迈进了一步。这一分支领域研究的是人眼看不见的粒子。...
  4. android在控制台签名apk
  5. MYSQL专题-由简到繁理解索引结构
  6. SAP Spartacus 的 CSS 架构
  7. 联想成立数据智能事业部,前京东蓝烨回归;华为或已向多国知识产权组织提交「鸿蒙」商标申请……...
  8. nodejs学习---1、命令行和环境变量
  9. mysql,jdbc、连接池
  10. 无线网络,把我整惨了。求助各位了。
  11. poj 1426 Find The Multiple (简单搜索dfs)
  12. 自身经历解读:2021 校招算法岗, 劝退还是继续
  13. VMware Workstation 15 解锁Mac OS安装
  14. PHP带头大哥的百宝囊!
  15. 程序员应该怎么学数学
  16. php kindeditor远程图片上传,KindEditor远程跨域上传的实现
  17. VS2010 .net4.0 登录QQ 获取QQ空间日志 右键选中直接打开日志 免积分 源码下载
  18. 【小5聊】Windows Server R2 SP1 2008鼠标右键新建选项为空
  19. 生成模型与判别模型的区别与联系
  20. 对话|Imagination推出B系列GPU IP,力挺本土芯片的图形渲染和AI创新

热门文章

  1. linux刷新jdk,Linux安装更新JDK
  2. vue 跳转页面带对象_vue跳转页面的几种方法(推荐)
  3. java系列8:一个标准的类
  4. DAOSquare将于今晚9点-12点进行两轮ITO
  5. SAP License:分摊、分配、定期重过账
  6. SAP License:SAP财务管理的认识
  7. 怎么做一张优雅的数据源监控报表
  8. C 和 CPP 混合代码cmath编译出错
  9. 【git】搭建git服务器
  10. mark ubuntu 16.04 64bit + cpu only install mtcnn