from: http://www.cnblogs.com/tedzhao/archive/2008/05/26/1206514.html
ASP.NET 2.0 Callback 使得ASP.NET Server端控件能够调用服务端的方法而不需要执行一个完整的Postback过程,也就是说使得Server端控件可以很好的支持Ajax。
Callback在向服务器发送请求时,只有ViewState和用户自定义信息被发送到服务器端,请求完毕后,只返回用户自定义结果,而不会Render页面。这不同于Postback。
GridView控件正是使用了这个技术来实现无刷新的分页及排序功能,那么它是如何实现的哪,我们又如何在自定义控件中添加该功能哪?本文将会简单地阐述如何使用ASP.NET 2.0 Callback来实现Ajax.
1. ICallbackEventHandler 接口
ASP.NET Server端控件可以通过实现ICallbackEventHandler 接口来接受客户端Callback事件。
ICallbackEventHandler 接口声明:
2 {
3 string GetCallbackResult();
4 void RaiseCallbackEvent(string eventArgument);
5}
RaiseCallbackEvent负责处理客户端回调事件,其中方法参数eventArgument是客户端脚本在触发Callback时提供的,该方法将会依赖于eventArgument参数来进行处理。
GetCallbackResult则负责将处理结果作为String返回给客户端脚本。当Callback完成后客户端脚本将会根据得到的处理结果,进行页面局部更新。
2. CallbackEventReference
那么怎么样才能注册一段客户端脚本来触发Callback,还需要做些什么哪?
ClientScriptManager类用于管理Web页面中的客户端脚本,提供了一系列的方法来注册脚本,并且还可以获得指定客户端脚本函数的引用。通过ClientScriptManager类的GetCallbackEventReference方法我们可以获取一个对客户端函数的引用。当该函数在客户端被调用时,将启动一次客户端回调。
public string GetCallbackEventReference ( string target, string argument, string clientCallback, string context, string clientErrorCallback, bool useAsync ) |
-
target
-
处理客户端回调的服务器 Control 的名称。该控件必须实现 ICallbackEventHandler 接口并提供 RaiseCallbackEvent 方法。
-
argument
-
从客户端脚本传递给服务器端的一个参数。
-
clientCallback
-
一个客户端事件处理程序的名称,该处理程序接收成功的服务器端事件的结果。
-
context
-
启动回调之前在客户端计算的客户端脚本。脚本的结果传回客户端事件处理程序。
-
clientErrorCallback
-
客户端事件处理程序的名称,该处理程序在服务器端事件处理程序出现错误时接收结果。
-
useAsync
-
true 表示异步执行回调;false 表示同步执行回调。 (注:asynchronous是异步的意思,msdn翻译有误,详见最后附录)
返回值
调用客户端回调的客户端函数的名称。
note:
获取这个Callback客户端函数的引用之后,我们可以注册一个新的客户端函数来调用它。然后在客户端就可以通过新注册的函数来进行Callback了。
3.示例
我们通过一个简单的例子来剖析ASP.NET 2.0 Callback的整个执行过程:
2 {
3 private const string Script1 = "function onCallbackComplete(result){ /n" +
4 " var element = document.getElementById('%ID%'); /n" +
5 " if(element != null) /n" +
6 " element.innerHTML = result;} /n";
7
8 private const string Script2 = "function onCallbackError(){ /n" +
9 " var element = document.getElementById('%ID%'); /n" +
10 " if(element != null) /n" +
11 " element.innerHTML = 'error';} /n";
12
13 public string GetCallbackResult()
14 {
15 return "Callback result";
16 }
17
18 public void RaiseCallbackEvent(string eventArgument)
19 {
20 }
21
22 public override void RenderBeginTag(HtmlTextWriter writer)
23 {
24 writer.AddAttribute(HtmlTextWriterAttribute.Onclick, "DoClientCallBack()");
25 base.RenderBeginTag(writer);
26 writer.Write("My Callback control");
27 }
28
29 protected override void OnPreRender(EventArgs e)
30 {
31 //Define callback references.
32 string callbackRef = this.Page.ClientScript.GetCallbackEventReference(
33 this, "", "onCallbackComplete", null, "onCallbackError", true);
34
35 // Register script blocks will perform call to the server.
36 this.Page.ClientScript.RegisterClientScriptBlock(
37 this.GetType(), "DoClientCallBack",
38 "function DoClientCallBack() { " + callbackRef + "} /n", true
39 );
40
41 // Register other scripts
42 this.Page.ClientScript.RegisterClientScriptBlock(
43 this.GetType(), "onCallbackComplete",
44 Script1.Replace("%ID%", this.ClientID), true);
45 this.Page.ClientScript.RegisterClientScriptBlock(
46 this.GetType(), "onCallbackError",
47 Script2.Replace("%ID%", this.ClientID), true);
48
49 base.OnPreRender(e);
50 }
将上面的写好的控件放到一个Page上,在Runtime 当点击该控件的时候便会执行一次Callback,并且更新控件内容。
其中WebForm_DoCallback和WebForm_CallbackComplete是微软JavaScript库中的方法。
ASP.NET 2.0 Callback提供了一种简单的方法来使得ASP.NET Server段控件可以支持AJAX,其本身可以看作是一种轻量级的Postback。
全文完。
[更新 2008.05.27]
关于构建XMLHttpRequest时,设置useAsync参数为True和False的区别,我摘录了MSDN的解释:
bAsync Optional.
Variant that specifies true for asynchronous operation (the call returns immediately), or false for synchronous operation. If true, assign a callback handler to the onreadystatechange property to determine when the call has completed. If not specified, the default is true.
注意黑体字部分,另外还有一点区别就是,当这次请求是同步的时候,是没有办法Cancel的。也就是说只有在 bAsync为True的时候,XmlHttpRequest对象的Abort方法才会生效。