![](/assets/blank.gif)
ASP.NET2. 0 开发无刷新页面
![](/assets/blank.gif)
在已经发布的 ASP.NET2. 0 中,越来越多的 Ajax 开发包被开发出来的情况下, ASP.NET2. 0 自带的无刷新页面技术没有被很多人了解,甚至不少人认为该功能有些“鸡肋”。但如果我们仅仅是在程序中加入很少部分的 Ajax 特性, Atlas 、 Ajax.Net 等就显得有些“杀鸡用牛刀”的感觉了。而且,我认为使用 ASP.NET2. 0 提供的方法进行开发并不很复杂,相反,使用很少的代码就可以做出来很棒的效果!
![](/assets/blank.gif)
下面我来一步一步的带大家开发无刷新的页面!
![](/assets/blank.gif)
第一步:实现 ICallBackEventHandler 接口
![](/assets/blank.gif)
ICallbackEventHandler接口位于System.Web.UI命名空间下。在beta2时,ICallbackEventHandler只包含一个RaiseCallbackEvent方法,即处理回调事件,又返回处理结果。在正式版中,它变成了包含GetCallbackResult和RaiseCallbackEvent两个成员方法,第一个用来返回回调事件的结果,第二个用来出来回调事件。这个变化主要是为了编写Web控件而做的改动,具体可以看一下GridView等控件中的实现代码。
![](/assets/blank.gif)
建立一个 Web 网站,我们来修改 default .aspx.cs 文件:
![](/assets/blank.gif)
1 public partial class _Default : System.Web.UI.Page, ICallbackEventHandler
![](/assets/blank.gif)
1 private string str;
![](/assets/blank.gif)
2 public void RaiseCallbackEvent( string eventArgument)
![](/assets/blank.gif)
![](/assets/blank.gif)
3
![](/assets/blank.gif)
{
![](/assets/blank.gif)
4 //可以根据传递的参数不同,调用不同的处理逻辑
![](/assets/blank.gif)
5 str = "从服务器端返回的内容:" + eventArgument;
![](/assets/blank.gif)
6 }
![](/assets/blank.gif)
7
![](/assets/blank.gif)
8 public string GetCallbackResult()
![](/assets/blank.gif)
![](/assets/blank.gif)
9
![](/assets/blank.gif)
{
![](/assets/blank.gif)
10 return str;
![](/assets/blank.gif)
11 }
![](/assets/blank.gif)
12
![](/assets/blank.gif)
第二步:注册回调方法 我们在 default .aspx 页面中添加一个 TextBox ,一个 Label 和一个 Html 控件 Button ,并给 Button 添加 onclick事件:
![](/assets/blank.gif)
1 < asp:TextBox ID = " TextBox1 " runat = " server " ></ asp:TextBox >
![](/assets/blank.gif)
2 < input id = " Button1 " type = " button " value = " 提交到Label1 " onclick = " CallServer(TextBox1, Label1) " />< br />
![](/assets/blank.gif)
3 < asp:Label ID = " Label1 " runat = " server " Text = " Label1: " ></ asp:Label >
![](/assets/blank.gif)
4
![](/assets/blank.gif)
1 < script type = " text/javascript " >
![](/assets/blank.gif)
2 // 由button调用
![](/assets/blank.gif)
3 function CallServer(inputcontrol, context)
![](/assets/blank.gif)
![](/assets/blank.gif)
4
![](/assets/blank.gif)
{
![](/assets/blank.gif)
5 context.innerHTML = "Loading";
![](/assets/blank.gif)
6 arg = inputcontrol.value;
![](/assets/blank.gif)
7 //注册回调方法
![](/assets/blank.gif)
8 <%= ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context")%>;
![](/assets/blank.gif)
9 }
![](/assets/blank.gif)
10 // 在回调方法中注册的接收返回结果的函数
![](/assets/blank.gif)
11 function ReceiveServerData(result, context)
![](/assets/blank.gif)
![](/assets/blank.gif)
12
![](/assets/blank.gif)
{
![](/assets/blank.gif)
13 context.innerHTML = result;
![](/assets/blank.gif)
14 }
![](/assets/blank.gif)
15 </ script >
![](/assets/blank.gif)
16
![](/assets/blank.gif)
好了,一个无刷新的页面就开发完了,它可以将你在 TextBox 中输入的文字,通过服务器代码写回到页面的 Label 中。是不是很简单?你可以运行一下你的程序看看效果啦!
![](/assets/blank.gif)
下面我们来分析一下这些代码。 首先,我们看
![](/assets/blank.gif)
<%= ClientScript.GetCallbackEventReference( this , " arg " , " ReceiveServerData " , " context " ) %> ;
![](/assets/blank.gif)
ClientScript是System.Web.UI.Page对象的一个属性,它是System.Web.UI.ClientScriptManager对象。用于管理客户端脚本,GetCallbackEventReference方法用于注册一个服务器端事件的客户端回调。它的第四个参数“Context”非常重要,在上面的代码中可以看到,调用CallServer方法时,传递的Context参数就是Label1,而ReceiveServerData的第二个参数“Context”就是被传递过来的Label1。在我的例子中,Context被用于设定一个用来显示服务端返回结果的控件。其实,你可以将任意的对象赋值给Context,它都会被传递给本地端处理回调返回结果的函数,这样,你就可以根据调用前指定的“上下文”灵活的操作返回结果了!在下面给出的完整例子中,你可以看到一个使用Context做的无刷新显示GridView的例子。
![](/assets/blank.gif)
OK,在ASP.NET 2 .0中开发具有Ajax特性的东东不难吧!其实就是两步:
![](/assets/blank.gif)
1 、 在Server端实现ICallbackEventHandler接口,在接口包含的方法中根据传递的参数分别调用不同的处理方法,然后返回结果;
![](/assets/blank.gif)
2 、 在Client端注册回调函数(当然你也可以在Server端注册),然后实现处理回调结果的函数。其中,如果对Context能灵活运用,你就可以做出非常好的效果。
![](/assets/blank.gif)
.ASPX代码
![](/assets/blank.gif)
<% @ Page Language = " C# " AutoEventWireup = " true " CodeFile = " Default.aspx.cs " Inherits = " _Default " %>
![](/assets/blank.gif)
<! DOCTYPE html PUBLIC " -//W3C//DTD XHTML 1.0 Transitional//EN " " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd " >
![](/assets/blank.gif)
< html xmlns = " http://www.w3.org/1999/xhtml " >
![](/assets/blank.gif)
< head runat = " server " >
![](/assets/blank.gif)
< title > ASP.NET 2.0 页面提交无刷新演示 </ title >
![](/assets/blank.gif)
< script type = " text/javascript " >
![](/assets/blank.gif)
function CallServer1(inputcontrol, context)
![](/assets/blank.gif)
![](/assets/blank.gif)
{
![](/assets/blank.gif)
context.innerHTML = "<IMG SRC='images/pie.gif' />Loading";
![](/assets/blank.gif)
arg = 'ServerMethod1|' + inputcontrol.value;
![](/assets/blank.gif)
<%= ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData1", "context")%>;
![](/assets/blank.gif)
}
![](/assets/blank.gif)
function ReceiveServerData1(result, context)
![](/assets/blank.gif)
![](/assets/blank.gif)
{
![](/assets/blank.gif)
context.innerHTML = context.id + ":" + result;
![](/assets/blank.gif)
}
![](/assets/blank.gif)
function CallServer2(obj)
![](/assets/blank.gif)
![](/assets/blank.gif)
{
![](/assets/blank.gif)
context = gridspan;
![](/assets/blank.gif)
context.innerHTML = "<IMG SRC='images/pie.gif' />数据加载中";
![](/assets/blank.gif)
arg = "ServerMethod2|" + obj.value;
![](/assets/blank.gif)
<%= ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData2", "context")%>;
![](/assets/blank.gif)
}
![](/assets/blank.gif)
function ReceiveServerData2(result, context)
![](/assets/blank.gif)
![](/assets/blank.gif)
{
![](/assets/blank.gif)
context.innerHTML = result;
![](/assets/blank.gif)
}
![](/assets/blank.gif)
</ script >
![](/assets/blank.gif)
</ head >
![](/assets/blank.gif)
< body >
![](/assets/blank.gif)
< form id = " form1 " runat = " server " >
![](/assets/blank.gif)
< div >
![](/assets/blank.gif)
< h1 > Demo1:html按钮提交数据 </ h1 >< br />
![](/assets/blank.gif)
< asp:TextBox ID = " TextBox1 " runat = " server " ></ asp:TextBox >
![](/assets/blank.gif)
< input id = " Button1 " type = " button " value = " 提交到Label1 " onclick = " CallServer1(TextBox1, Label1) " />& nbsp;
![](/assets/blank.gif)
< input id = " Button2 " type = " button " value = " 提交到Label2 " onclick = " CallServer1(TextBox1, Label2) " />
![](/assets/blank.gif)
< br />
![](/assets/blank.gif)
< asp:Label ID = " Label1 " runat = " server " Text = " Label1: " ></ asp:Label >
![](/assets/blank.gif)
< br />
![](/assets/blank.gif)
< asp:Label ID = " Label2 " runat = " server " Text = " Label2: " ></ asp:Label >
![](/assets/blank.gif)
</ div >
![](/assets/blank.gif)
< hr />
![](/assets/blank.gif)
< div >
![](/assets/blank.gif)
< h1 > Demo2:服务器按钮提交数据 </ h1 >< br />
![](/assets/blank.gif)
< asp:TextBox ID = " TextBox2 " runat = " server " ></ asp:TextBox >
![](/assets/blank.gif)
< asp:Button ID = " Button3 " runat = " server " Text = " Button " />< br />
![](/assets/blank.gif)
< asp:Label ID = " Label3 " runat = " server " Text = " Label3: " ></ asp:Label ></ div >
![](/assets/blank.gif)
< hr />
![](/assets/blank.gif)
< div >
![](/assets/blank.gif)
< h1 > Demo3:下拉列表框和gridview绑定数据 </ h1 >< br />
![](/assets/blank.gif)
< asp:SqlDataSource ID = " SqlDataSource1 " runat = " server " ConnectionString = " <%$ connectionStrings:test %> "
![](/assets/blank.gif)
SelectCommand = " select distinct(country) from customers " ></ asp:SqlDataSource >
![](/assets/blank.gif)
< asp:SqlDataSource ID = " SqlDataSource2 " runat = " server " ConnectionString = " <%$ connectionStrings:test %> "
![](/assets/blank.gif)
SelectCommand = " select customerid, companyname, country from customers where country=@Country " >
![](/assets/blank.gif)
< SelectParameters >
![](/assets/blank.gif)
< asp:ControlParameter Name = " Country " ControlID = " DropDownList1 " PropertyName = " SelectedValue " />
![](/assets/blank.gif)
</ SelectParameters >
![](/assets/blank.gif)
</ asp:SqlDataSource >
![](/assets/blank.gif)
< div >
![](/assets/blank.gif)
< asp:DropDownList ID = " DropDownList1 " runat = " server " Width = " 239px "
![](/assets/blank.gif)
DataSourceID = " SqlDataSource1 " DataTextField = " Country " DataValueField = " Country " >
![](/assets/blank.gif)
</ asp:DropDownList >
![](/assets/blank.gif)
</ div >
![](/assets/blank.gif)
< br />
![](/assets/blank.gif)
< span id = " gridspan " >
![](/assets/blank.gif)
< asp:GridView ID = " GridView1 " runat = " server " DataSourceID = " SqlDataSource2 " >
![](/assets/blank.gif)
</ asp:GridView >
![](/assets/blank.gif)
</ span >
![](/assets/blank.gif)
</ div >
![](/assets/blank.gif)
</ form >
![](/assets/blank.gif)
</ body >
![](/assets/blank.gif)
</ html >
![](/assets/blank.gif)
.CS代码
![](/assets/blank.gif)
using System;
![](/assets/blank.gif)
using System.Data;
![](/assets/blank.gif)
using System.Configuration;
![](/assets/blank.gif)
using System.Web;
![](/assets/blank.gif)
using System.Web.Security;
![](/assets/blank.gif)
using System.Web.UI;
![](/assets/blank.gif)
using System.Web.UI.WebControls;
![](/assets/blank.gif)
using System.Web.UI.WebControls.WebParts;
![](/assets/blank.gif)
using System.Web.UI.HtmlControls;
![](/assets/blank.gif)
using System.IO;
![](/assets/blank.gif)
using System.Globalization;
![](/assets/blank.gif)
public partial class _Default : System.Web.UI.Page, ICallbackEventHandler
![](/assets/blank.gif)
![](/assets/blank.gif)
{
![](/assets/blank.gif)
protected void Page_Load(object sender, EventArgs e)
![](/assets/blank.gif)
![](/assets/blank.gif)
{
![](/assets/blank.gif)
//注册客户端事件处理方法
![](/assets/blank.gif)
Button3.Attributes.Add("onclick", "CallServer1(TextBox2, Label3);return false;");
![](/assets/blank.gif)
DropDownList1.Attributes.Add("onchange", "CallServer2(this)");
![](/assets/blank.gif)
}
![](/assets/blank.gif)
private string serverReturn;
![](/assets/blank.gif)
public string GetCallbackResult()
![](/assets/blank.gif)
![](/assets/blank.gif)
{
![](/assets/blank.gif)
//为便于查看加载效果,添加延时
![](/assets/blank.gif)
System.Threading.Thread.Sleep(2000);
![](/assets/blank.gif)
string[] parts = serverReturn.Split('|');
![](/assets/blank.gif)
//根据传递的方法名进行调用,并传递相应的参数,目前只支持一个参数
![](/assets/blank.gif)
![](/assets/blank.gif)
return (string)GetType().GetMethod(parts[0]).Invoke(this, new object[]
![](/assets/blank.gif)
{ parts[1] });
![](/assets/blank.gif)
}
![](/assets/blank.gif)
public void RaiseCallbackEvent(string eventArgument)
![](/assets/blank.gif)
![](/assets/blank.gif)
{
![](/assets/blank.gif)
serverReturn = eventArgument;
![](/assets/blank.gif)
}
![](/assets/blank.gif)
//根据从客户端传来的英文国家名或缩写,翻译成相应的中文国家名
![](/assets/blank.gif)
public string ServerMethod1(string arg)
![](/assets/blank.gif)
![](/assets/blank.gif)
{
![](/assets/blank.gif)
string s;
![](/assets/blank.gif)
switch (arg.ToLower())
![](/assets/blank.gif)
![](/assets/blank.gif)
{
![](/assets/blank.gif)
case "cn":
![](/assets/blank.gif)
case "china":
![](/assets/blank.gif)
s = "中国";
![](/assets/blank.gif)
break;
![](/assets/blank.gif)
case "us":
![](/assets/blank.gif)
s = "美国";
![](/assets/blank.gif)
break;
![](/assets/blank.gif)
default:
![](/assets/blank.gif)
s = "未知国家";
![](/assets/blank.gif)
break;
![](/assets/blank.gif)
}
![](/assets/blank.gif)
return s;
![](/assets/blank.gif)
}
![](/assets/blank.gif)
//根据从客户端传来的值,对GridView的内容进行更新,并将更新后的GridView的html返回
![](/assets/blank.gif)
public string ServerMethod2(string arg)
![](/assets/blank.gif)
![](/assets/blank.gif)
{
![](/assets/blank.gif)
DropDownList1.SelectedValue = arg;
![](/assets/blank.gif)
GridView1.DataBind();
![](/assets/blank.gif)
return RenderControl(GridView1);
![](/assets/blank.gif)
}
![](/assets/blank.gif)
private string RenderControl(Control control)
![](/assets/blank.gif)
![](/assets/blank.gif)
{
![](/assets/blank.gif)
StringWriter writer1 = new StringWriter(CultureInfo.InvariantCulture);
![](/assets/blank.gif)
HtmlTextWriter writer2 = new HtmlTextWriter(writer1);
![](/assets/blank.gif)
control.RenderControl(writer2);
![](/assets/blank.gif)
writer2.Flush();
![](/assets/blank.gif)
writer2.Close();
![](/assets/blank.gif)
return writer1.ToString();
![](/assets/blank.gif)
}
![](/assets/blank.gif)
}
![](/assets/blank.gif)
webconfig
![](/assets/blank.gif)
< configuration >
![](/assets/blank.gif)
< appSettings />
![](/assets/blank.gif)
< connectionStrings >
![](/assets/blank.gif)
< add name = " test " connectionString = " server=maxwin;Integrated security=true;database=TestCallBackAjax " />
![](/assets/blank.gif)
</ connectionStrings >
![](/assets/blank.gif)
< system.web >
![](/assets/blank.gif)
< compilation debug = " true " />
![](/assets/blank.gif)
</ system.web >
![](/assets/blank.gif)
</ configuration >