16.3 AJAX编程

  通过编程的方法实现AJAX高级功能,能够补充现有的AJAX功能。例如在执行局部更新时,如果出现了异常,则需要通过编程的方法实现错误信息提交,这样不仅能够提升用户体验的友好度,也能够提升应用程序的健壮性。

16.3.1 自定义异常处理
  在AJAX应用程序开发和使用中,用户很容易输入错误信息的信息造成异常。例如在UpdatePanel控件中执行应用程序操作时,如果发生了错误,则会弹出一个对话框,这个对话框对用户来说非常晦涩并且极不友好,这里就需要自定义异常处理。在页面中,首先需要创建一个ScriptManage控件和UpdatePanel控件,示例代码如下所示。
+展开
-HTML
<body>
    <form id="form1" runat="server">
    <div>
        <asp:ScriptManager ID="ScriptManager1" runat="server">
        </asp:ScriptManager>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        </asp:UpdatePanel>
    </div>
    </form>
</body>

  上述代码创建了一个ScriptManage控件和UpdatePanel控件,在UpdatePanel控件中,开发人员可以拖放用户控件,以便进行页面局部更新,示例代码如下所示。
+展开
-HTML
    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
            <asp:Label ID="Label1" runat="server" Text="计算器"></asp:Label>
                <br >
                <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
                除以<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
                等于<asp:TextBox ID="TextBox3" runat="server"></asp:TextBox>
                <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="计算" />
        </ContentTemplate>
    </asp:UpdatePanel>

  上述代码编写了一个简单的计算器,用户能够通过输入相应的数字进行运算,CS页面代码如下所示。
+展开
-C#
        protected void Button1_Click(object sender, EventArgs e)
        {
            try
            {
                int a, b;//创建整型变量
                float c;//创建浮点型变量
                a = Convert.ToInt32(TextBox1.Text);//获取数值
                b = Convert.ToInt32(TextBox2.Text);//获取数值
                c = a / b;//进行计算
                TextBox3.Text = c.ToString();//结果呈现
            }
            catch(Exception ee)
            {
                ee.Data["error"] = "自定义错误"; //编写自定义错误
                throw ee; //抛出自定义错误
            }
        }

  上述代码描述了当用户单击按钮后,页面执行转换,即将文本框中的文本进行转换。转换完成后再相除,相除后输出到TextBox3中。但是这里会有一个问题,这个问题就是如果用户输入的不是数字,或者输入数字的除数是0,都会导致异常。开发人员能够自定义异常并抛出异常,示例代码如下所示。
+展开
-C#
                ee.Data["error"] = "自定义错误";//编写自定义错误
                throw ee; //抛出自定义错误

  当重新抛出异常后,ScriptManage控件能够捕捉该异常。为了让ScriptManage控件捕捉异常,可以编写ScriptManage控件的AsyncPostBackError事件,示例代码如下所示。
+展开
-C#
        protected void ScriptManager1_AsyncPostBackError(object sender, AsyncPostBackErrorEventArgs e)
        {
            if (e.Exception.Data["error"] != null)//判断自定义错误
            {
                ScriptManager1.AsyncPostBackErrorMessage = 
                "发生了一个错误" + e.Exception.Data["error"].ToString(); //呈现自定义错误
            }
            else
            {
                ScriptManager1.AsyncPostBackErrorMessage = "发生了一个错误";//默认系统错误
            }
        }

  上述代码通过ScriptManage控件的AsyncPostBackError事件捕获一个异常,如果抛出的异常被ScriptManage控件捕获,则会通过对话框的形式呈现在客户端浏览器,如图16-18所示。
自定义异常处理
图16-18 自定义异常处理

16.3.2 使用母版页的UpdatePanel
  在AJAX应用程序的开发中,常常需要制作大量的相同页面,这些相同的页面可以使用母版页进行样式控制,而内容页只需要进行控件布局即可。如果在母版页中需要完成和实现AJAX应用,则可以在母版页中使用UpdatePanel控件进行局部更新。母版页示例代码如下所示。
+展开
-HTML
<body>
    <form id="form1" runat="server">
    <div style="width:300px; float:left; background:#f0f0f0; height:300px">
        <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
        </asp:ContentPlaceHolder>
        <asp:UpdatePanel ID="UpdatePanel2" runat="server">
            <ContentTemplate>
                <asp:ScriptManager ID="ScriptManager1" runat="server">
                </asp:ScriptManager>
                <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
                <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="获取当前时间" />
            </ContentTemplate>
        </asp:UpdatePanel>
    </div>
    <div style="width:300px; float:left; background:gray;color:White;height:300px">
        <asp:ContentPlaceHolder ID="ContentPlaceHolder2" runat="server">
        </asp:ContentPlaceHolder>
    </div>
    </form>
</body>

  上述代码在母版页中声明了一个ScriptManage控件和一个UpdatePanel控件,在母版页中可以通过向UpdatePanel控件拖动服务器控件以完成页面局部刷新。在编写内容窗体时,可以无需再创建ScriptManage控件也同样能够进行页面拒不更新,内容窗体示例代码如下所示。
+展开
-HTML
<%@ Page Language="C#" 
MasterPageFile="~/Site1.Master" 
AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="_16_4.WebForm1" Title="无标题页" %>

    <asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
        </asp:Content>
        <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
    </asp:Content>
    <asp:Content ID="Content3" ContentPlaceHolderID="ContentPlaceHolder2" runat="server">
    <asp:UpdatePanel ID="UpdatePanel3" runat="server">
        <ContentTemplate>
        <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
        <asp:Button ID="Button2" runat="server" onclick="Button2_Click" Text="get time" />
        </ContentTemplate>
    </asp:UpdatePanel>
</asp:Content>

  在内容窗体中,内容窗体使用了母版页,而母版页中已经包含了ScriptManage控件,所以当母版页和内容窗体整合在一起呈现一个新页面时,新的页面已经包含了ScriptManage控件。所以在对内容窗体中UpdatePanel控件中的控件进行更新时,就算内容窗体中没有ScriptManage控件,也能够进行局部更新。
  注意:如果在内容窗体中使用ScriptManage控件,则会抛出异常,因为一个页面只允许使用一个ScriptManage控件,当需要在内容窗体中也使用ScriptManage控件时,可以使用ScriptManageProxy控件。

16.3.3 母版页刷新内容窗体
  在母版页中使用ScriptManage控件能够方便的将整个页面进行AJAX全局控制。当Web应用中有很多相似页面,又需要执行AJAX应用时,可以在母版页中使用ScriptManage控件,在内容窗体中使用UpdatePanel控件,这样母版页中的ScriptManage控件也会整合到内容窗体中并进行整合输出。
  同样,母版页也能够刷新内容窗体中的控件信息,在上一节中,母版页使用了ScriptManage控件进行全局控制,而内容窗体则通过本身的按钮实现时间的获取。在母版页中,可以创建一个按钮控件以执行内容窗体中文本框控件的局部更新,母版页局部示例代码如下所示。
+展开
-HTML
    <asp:UpdatePanel ID="UpdatePanel2" runat="server">
        <ContentTemplate>
            <asp:ScriptManager ID="ScriptManager1" runat="server">
                </asp:ScriptManager>
                <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
                <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="获取当前时间" />
                <br >
            <asp:Button ID="Button2" runat="server" Text="刷新子母版的值" />
        </ContentTemplate>
    </asp:UpdatePanel>

  上述代码在母版页中增加了一个按钮,通过该按钮控件能够刷新内容窗体中控件的值。但是如果要实现母版页刷新内容窗体的值,首先需要在母版页代码中注册这两个按钮为异步提交按钮,示例代码如下所示。
+展开
-C#
        protected void Page_Load(object sender, EventArgs e)
        {
            ScriptManager1.RegisterAsyncPostBackControl(Button2);//注册异步操作
        }

  上述代码通过使用RegisterAsyncPostBackControl方法进行异步提交按钮控件的注册,注册完毕后就能够为控件编写相应的事件,示例代码如下所示。
+展开
-C#
        protected void Button2_Click(object sender, EventArgs e)
        {
            ((UpdatePanel)ContentPlaceHolder2.FindControl("UpdatePanel3")).Update();//查找相应的控件
            TextBox tex = ((TextBox)ContentPlaceHolder2.FindControl("TextBox2")); //创建TextBox
            tex.Text = DateTime.Now.ToString();//更改控件值
        }

  上述代码通过FindControl的方法进行控件的寻找和更改,找到目标控件后再进行目标控件的值的更改。在母版页注册异步提交按钮的方法并实现相应事件后,母版页并不能直接的进行内容窗体的更改,在内容窗体的UpdatePanel控件中,必须将UpdateMode属性更改为Conditional,这样才能在内容窗体中接受母版页中进行局部更新的事件。运行后如图16-19所示。
通过母版页进行内容窗体局部刷新
图16-19 通过母版页进行内容窗体局部刷新
  如果ASP.NET AJAX Web应用中很多的页面都需要执行相同的操作,而内容窗体同样需要执行这些操作,可以通过在母版页中注册异步传送控件以支持内容窗体中AJAX应用的需求,这样只需要在内容窗体中进行控件布局,而无需在内容窗体中再次创建局部更新控件和进行事件的编写。

加支付宝好友偷能量挖...


评论(0)网络
阅读(142)喜欢(0)Asp.Net/C#/WCF