http://msdn2.microsoft.com/zh-cn/library/ms178208(VS.80).aspx 以及一个示例:
http://msdn2.microsoft.com/zh-cn/library/ms178210(VS.80).aspx
实现的过程基本上就是:让要实现客户端回调功能的页面或者空间实现System.Web.UI.ICallbackEventHandler的接口,即2个方法:void RaiseCallbackEvent(string eventArgument),这个是当客户端触发服务器端事件的委托方法,string GetCallbackResult();这个是返回客户端需要的值,只能是string 型的,当然你也可以返回一个Json串。
然后在pageload的时候注册脚本到客户端:在这里注册一个CallServer方法来调用服务器端方法,ReceiveServerData来捕获服务器返回的结果。当然你也可以使用一个方法来捕获服务器端的错误,详见Page.ClientScript.RegisterClientScriptBlock这个方法的MSDN解释。
这样就能实现客户端的回调服务器端事件,并返回值。
生成好页面后,查看源代码:
首先是多了一个js资源文件,多了一行这样的代码:
首先看js资源文件(20多K,汗一个...)。先在资源文件里面找到这个方法,WebForm_InitCallback();
方法如下:
1
}
这个方法就是把表单里面所有的值全部装载到一个键值对里面去。附WebForm_InitCallbackAddField(element.name, element.value);方法实现:
那么就是asp.net在初始化客户端回调功能的时候,其实就是将表单里面的所有键值对全部装载到一个全局的键值对里面去了。
然后,咱们来看看unction CallServer(arg, context){ WebForm_DoCallback('__Page',arg,ReceiveServerData,context,null,false);}所作的工作。
在示例中,点击按钮,就触发了CallServer方法,
在资源文件中找到WebForm_DoCallback方法,由于方法太长太大,只有分段解析:
不过俺们还忽略了一些细节,让我们从头再来。上面有一段代码
if (setRequestHeaderMethodExists)
也就是说在setRequestHeaderMethodExists这个变量不为null的时候才能够发送异步对象,那么这个变量是怎么定义的呢??
再下来应该就是给这个iframe里面加载一些变量了,并且提交这个iframe了:
原来在最开始初始化客户端回调的方法就是为了在不能够正确创建ajax对象的时候,将表单的值全部初始化到另外的iframe里面去的。
好了,整个asp.net客户端回调的请求发送部分分析完了,看来回调部分要下次了。
如果有分析不对的地方还请大侠指正!
附加提供脚本文件:https://files.cnblogs.com/silverlighter/clientcallback.js