ASP.NET 2.0 Client Callback (ICallBackEventHandler)

 

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 接口声明:

1 public   interface  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的整个执行过程:

 1 public   class  MyControl : WebControl, ICallbackEventHandler
 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.

When bAsync is set to false, send operations are synchronous, and Windows Internet Explorer does not accept input or produce output while send operations are in progress. Therefore, this setting should not be used in situations where it is possible for a user to be waiting on the send operation to complete.

注意黑体字部分,另外还有一点区别就是,当这次请求是同步的时候,是没有办法Cancel的。也就是说只有在 bAsync为True的时候,XmlHttpRequest对象的Abort方法才会生效。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值