16.3 AJAX编程
通过编程的方法实现AJAX高级功能,能够补充现有的AJAX功能。例如在执行局部更新时,如果出现了异常,则需要通过编程的方法实现错误信息提交,这样不仅能够提升用户体验的友好度,也能够提升应用程序的健壮性。
16.3.1 自定义异常处理
在AJAX应用程序开发和使用中,用户很容易输入错误信息的信息造成异常。例如在UpdatePanel控件中执行应用程序操作时,如果发生了错误,则会弹出一个对话框,这个对话框对用户来说非常晦涩并且极不友好,这里就需要自定义异常处理。在页面中,首先需要创建一个ScriptManage控件和UpdatePanel控件,示例代码如下所示。
上述代码创建了一个ScriptManage控件和UpdatePanel控件,在UpdatePanel控件中,开发人员可以拖放用户控件,以便进行页面局部更新,示例代码如下所示。
上述代码编写了一个简单的计算器,用户能够通过输入相应的数字进行运算,CS页面代码如下所示。
上述代码描述了当用户单击按钮后,页面执行转换,即将文本框中的文本进行转换。转换完成后再相除,相除后输出到TextBox3中。但是这里会有一个问题,这个问题就是如果用户输入的不是数字,或者输入数字的除数是0,都会导致异常。开发人员能够自定义异常并抛出异常,示例代码如下所示。
当重新抛出异常后,ScriptManage控件能够捕捉该异常。为了让ScriptManage控件捕捉异常,可以编写ScriptManage控件的AsyncPostBackError事件,示例代码如下所示。
上述代码通过ScriptManage控件的AsyncPostBackError事件捕获一个异常,如果抛出的异常被ScriptManage控件捕获,则会通过对话框的形式呈现在客户端浏览器,如图16-18所示。
图16-18 自定义异常处理
16.3.2 使用母版页的UpdatePanel
在AJAX应用程序的开发中,常常需要制作大量的相同页面,这些相同的页面可以使用母版页进行样式控制,而内容页只需要进行控件布局即可。如果在母版页中需要完成和实现AJAX应用,则可以在母版页中使用UpdatePanel控件进行局部更新。母版页示例代码如下所示。
上述代码在母版页中声明了一个ScriptManage控件和一个UpdatePanel控件,在母版页中可以通过向UpdatePanel控件拖动服务器控件以完成页面局部刷新。在编写内容窗体时,可以无需再创建ScriptManage控件也同样能够进行页面拒不更新,内容窗体示例代码如下所示。
在内容窗体中,内容窗体使用了母版页,而母版页中已经包含了ScriptManage控件,所以当母版页和内容窗体整合在一起呈现一个新页面时,新的页面已经包含了ScriptManage控件。所以在对内容窗体中UpdatePanel控件中的控件进行更新时,就算内容窗体中没有ScriptManage控件,也能够进行局部更新。
注意:如果在内容窗体中使用ScriptManage控件,则会抛出异常,因为一个页面只允许使用一个ScriptManage控件,当需要在内容窗体中也使用ScriptManage控件时,可以使用ScriptManageProxy控件。
16.3.3 母版页刷新内容窗体
在母版页中使用ScriptManage控件能够方便的将整个页面进行AJAX全局控制。当Web应用中有很多相似页面,又需要执行AJAX应用时,可以在母版页中使用ScriptManage控件,在内容窗体中使用UpdatePanel控件,这样母版页中的ScriptManage控件也会整合到内容窗体中并进行整合输出。
同样,母版页也能够刷新内容窗体中的控件信息,在上一节中,母版页使用了ScriptManage控件进行全局控制,而内容窗体则通过本身的按钮实现时间的获取。在母版页中,可以创建一个按钮控件以执行内容窗体中文本框控件的局部更新,母版页局部示例代码如下所示。
上述代码在母版页中增加了一个按钮,通过该按钮控件能够刷新内容窗体中控件的值。但是如果要实现母版页刷新内容窗体的值,首先需要在母版页代码中注册这两个按钮为异步提交按钮,示例代码如下所示。
上述代码通过使用RegisterAsyncPostBackControl方法进行异步提交按钮控件的注册,注册完毕后就能够为控件编写相应的事件,示例代码如下所示。
上述代码通过FindControl的方法进行控件的寻找和更改,找到目标控件后再进行目标控件的值的更改。在母版页注册异步提交按钮的方法并实现相应事件后,母版页并不能直接的进行内容窗体的更改,在内容窗体的UpdatePanel控件中,必须将UpdateMode属性更改为Conditional,这样才能在内容窗体中接受母版页中进行局部更新的事件。运行后如图16-19所示。
图16-19 通过母版页进行内容窗体局部刷新
如果ASP.NET AJAX Web应用中很多的页面都需要执行相同的操作,而内容窗体同样需要执行这些操作,可以通过在母版页中注册异步传送控件以支持内容窗体中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>
<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>
<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; //抛出自定义错误
}
}
{
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; //抛出自定义错误
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 = "发生了一个错误";//默认系统错误
}
}
{
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>
<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>
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>
<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);//注册异步操作
}
{
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();//更改控件值
}
{
((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应用的需求,这样只需要在内容窗体中进行控件布局,而无需在内容窗体中再次创建局部更新控件和进行事件的编写。
加支付宝好友偷能量挖...