【转帖】Ajax的基本概念及.Net Callback 回调机制

来源:互联网 发布:优化方案系列丛书官网 编辑:程序博客网 时间:2024/05/18 09:36

 

1.1 Ajax知识
       Ajax 是 Asynchronous JavaScript and XML(以及 DHTML 等)的缩写。Ajax由几种已有技术以新的强大方式组合:基于XHTML和CSS标准的表示;使用Document Object Model进行动态显示和交互;使用XMLHttpRequest与服务器进行异步通信;使用JavaScript绑定一切。   
       在这个定义中,我们可以忽略所有内容,只要记住一下东西:XMLHTTPRequest对象,这个就是异步传送的至关重要的地方。有了它,就可以神不知鬼不觉的将一部分信息发送出去。
       Ajax模型如图1所示,对于这其中的原理也许你不懂,不过没有关系,先稍微看一下,能看懂当然是好事,看不懂,那就往下面看,记住上面那一句就行了!Ajax就像是一个独来独往的人,一个人单干!如果了解更多,就去谷歌搜索!

1.2  .Net Callback 回调机制
      微软在ASP.NET 2.0中提出客户端Callback机制,其目的在于实现页面异步调用和无刷新局部显示。从技术角度分析,Callback机制就是对AJAX部分功能进行了封装(图2),其框架中提供全新接口ICallbackEventHandler用来指示控件作为服务器的回调事件的目标,通过接口的方法可轻松实现页面局部刷新技术。

       从某种程度来说,我们可以认为.Net Callback 回调机制只是一个过渡产品 ,为后来的Asp.NET Ajax做准备,虽然ESRI公司的ArcIMS从3.X版本就运用HTML Viewer模式传输ArcXML数据与图片,利用JavaScript脚本控制操作同时采用DHTML技术显示地图,缺少了异步传输这关键一环。ArcGIS Server在其最新的ArcGIS Server 9.2中为解决含有ADF组件页面局部刷新问题,在Asp.Net 2.0 Callback机制的基础上扩充引入了Ajax架构。所以从这点来看,.Net Callback 回调机制对于我们每一个学习ArcGIS Server 的人来说还是依然至关重要的!

在深入学习Callback机制之前,请大家先学习一下接口和方法的概念,如果你不懂!那不好意思,你看不懂!

      我们说Callback机制实际上就是一个接口ICallbackEventHandler,提供了两个方法,
      GetCallbackResult和RaiseCallbackEvent,其语法结构分别如下:
      string GetcallbackResult();
      void RaiseCallbackEvent(string eventArgument);
      前者返回以控件为目标的回调事件的结果,后者处理以控件为目标的回调事件,即执行回调事件。通过以上两个方法回调所实现的功能主要是:从客户端接收一个数据参数,在服务器端获取这个参数,并执行一个实现所需功能的事件,最后返回客户端所需结果数据。因此,如果要应用Callback机制,Page就必须继承接口ICallbackEventHandler。
    感觉好像很乱,好了,不管怎么样,我们重新来说!
    根据图3来说吧,我们把Callback回调分成客户端操作、服务器操作、以及服务器回调返回后客户更新页面来说:
    客户端操作:比如,我们在图3中要完成一个在文本框中输入查询字符串后,查询结果在页面无刷新的情况下显示在地图上,没有问题!开始吧,在我们输入完成后,比如你按了一个按钮什么的,触发了一个服务器回调事件,有可能客户端代码如下:
    Function void GetAddr()
    {Var Addrtxt= document.getElementById('Addr_txt').value;
    <%=sCallBackFunctionInvocation%>}
   第一句好像看得懂,第二句就有点。。。,没有关系,你就理解成是向服务器端发送就可以了。。。
    服务器操作: 好的,现在就是我们的GetCallbackResult和RaiseCallbackEvent上场了,RaiseCallbackEvent接收值并处理,那么值在哪里呢,当然是客户端的传过来的,怎么传过来的呢?看下面这句:
    public string sCallBackFunctionInvocation = Page.ClientScript.GetCallbackEventReference(this, " Addrtxt", "processCallbackResult", "context");
    对于这里面涉及的方法,大家可以看看下面的内容:
在.net中有一个函数可以使用客户端的脚本调用服务器端指定的函数。也就是通过这个方法才实现了.net中页面的无回调刷新的public string GetCallbackEventReference (Control control,string argument,string clientCallback,string context)
参数:
       control 处理客户端回调的服务器 Control。该控件必须实现 ICallbackEventHandler 接口并提供 RaiseCallbackEvent 方法。
argument 从客户端脚本传递一个参数到服务器端的RaiseCallbackEvent 方法。
clientCallback 一个客户端事件处理程序的名称,该处理程序接收服务器端事件返回的结果。
context 启动回调之前在客户端的客户端脚本信息。脚本的结果传回给客户端事件处理程序。
返回值 调用客户端回调的客户端函数的名称。
返回服务器端的响应函数是没有选择的。必须是服务器端的RaiseCallbackEvent,因此当一个页面中有多个地方需要回调的时候,就需要使用参数来区分。
客户端的响应函数使用javascripts来写,没有什么问题,在这里把返回的结果刷新出来。
服务器端的实现代码放在RaiseCallbackEvent中,也没有什么问题。
还有一个问题就是GetCallbackEventReference这个函数放在哪里,
一个位置是放在page_load中,
m_copyrightCallback = Page.ClientScript.GetCallbackEventReference(Page, "argument", "processCallbackResult", "context", true);
另一个就是直接放在客户端的事件当中。
<%=ClientScript.GetCallbackEventReference(this,"imagechange","ShowServerTime2",null) %>
原创粉丝点击