当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > 浅析ASP.NET 2.0 Client Callback

ASP.NET
从ASP.NET的PHP执行速度比较谈起
基于ASP.NET2.0的非HttpModule山寨版MVC框架的实现
ASP.NET 中公有的六种验证控件
无废话C#设计模式之八:Facade
C# 中的 @ 符号的使用及注意事项
保护你的.Net代码:谁动了我的组件?
VS2008与.NET 3.5的JS智能感知和调试
关于 .Net 开发下的分布式缓存设计
在C#3.0中使用扩展方法来扩展接口
C#实现Windows 服务的制作安装和删除
C#3.0中实现隐式类型变量、匿名类型的方法
C#代码与javaScript函数的相互调用
构建 ASP.NET AJAX 开发环境
Windows 窗体的.Net 框架绘图技术
.NET 开发中的一些小技巧集锦
ASP.NET 2.0 创建母版页引来的麻烦
.NET Compact Framework 概述
.NET Compact Framework 2.0 SP1新增功能
专家访谈:从Web 2.0到Web 3.0
.Net里漂浮窗口拖动的实现方法

浅析ASP.NET 2.0 Client Callback


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-23   浏览: 150 ::
收藏到网摘: n/a

GridView控件正是使用了这个技术来实现无刷新的分页及排序功能,那么它是如何实现的哪,我们又如何在自定义控件中添加该功能哪?本文将会简单地阐述如何使用ASP.NET 2.0 Callback来实现Ajax.

1、ICallbackEventHandler 接口

ASP.NET Server端控件可以通过实现ICallbackEventHandler 接口来接受客户端Callback事件。
ICallbackEventHandler 接口声明:

RaiseCallbackEvent负责处理客户端回调事件,其中方法参数eventArgument是客户端脚本在触发Callback时提供的,该方法将会依赖于eventArgument参数来进行处理。
GetCallbackResult则负责将处理结果作为String返回给客户端脚本。当Callback完成后客户端脚本将会根据得到的处理结果,进行页面局部更新。

2、CallbackEventReference

那么怎么样才能注册一段客户端脚本来触发Callback,还需要做些什么哪?

ClientScriptManager类用于管理Web页面中的客户端脚本,提供了一系列的方法来注册脚本,并且还可以获得指定客户端脚本函数的引用。通过ClientScriptManager类的GetCallbackEventReference方法我们可以获取一个对客户端函数的引用。当该函数在客户端被调用时,将启动一次客户端回调。

GetCallbackEventReference方法声明:

以下为引用的内容:

public string GetCallbackEventReference (
Control control,
string argument,
string clientCallback,
string context,
string clientErrorCallback,
bool useAsync
)

第一个参数指的是实现ICallbackEventHandler接口的服务器端控件;
第二个参数将被传递给在服务器端执行的RaiseCallbackEvent方法,它可以是一个JavaScript函数调用表达式;
第三个参数是一个JavaScript函数名,在Callback完成后,该函数将被调用,同时服务器端函数GetCallbackResult的执行结果也将作为这一个函数的参数;
第四个参数是当前执行的Callback的上下文,这个参数也可以是一个JavaScript函数调用表达式; 
第五个参数是一个JavaScript函数名,在Callback执行的过程中如果有错误产生,该函数将被调用。
第六个参数是一个Bool值来确定当前Callback应该被同步执行还是异步执行。

获取这个Callback客户端函数的引用之后,我们可以注册一个新的客户端函数来调用它。然后再客户端就可以通过新注册的函数来进行Callback了。

3.示例

我们通过一个简单的例子来剖析ASP.NET 2.0 Callback的整个执行过程:

以下为引用的内容:

1public 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        }

其中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方法才会生效。