ArcGIS Web 应用开发框架(ADF)中的Ajax

        我希望各位看官在看这篇文章之前,先对.NET中内置的Ajax了解较透,如果还不是很明白,建议先看我的上一篇博文 .NET内置的Ajax工作原理
        ESRI ArcGIS Server 9.2 的web应用开发框架充分利用了ASP.NET中的回调技术。我们来看看利用Visual Studio 模板创建的默认应用程序中如何利用回调的。

        首先看到默认的主页面Default.aspx 对应的类 WebMapApplication 实现了 ICallbackEventHandler 接口。
        我们再以Identify工具来深入了解应用开发框架。
        在 WebMapApplication 类的 Load 事件处理器中,调用 new MapIdentify(Map1) 初始化Identify 工具。在 MapIdentify 类的构造函数中,调用了SetupIdentify 方法。该方法首先通过调用 GetCallbackEventReference 方法来生成客户端脚本,然后调用 RegisterClientScriptBlock 注册一个名为 identifyCallbackFunctionString 的 JavaScript 函数,该函数中调用生成的客户端脚本。
        在 display_mapidentify.js 文件的 MapIdClick 函数(Identify 事件处理器)中调用了 identifyCallbackFunctionString 函数,从而触发了 WebMapApplication 类的 RaiseCallbackEvent 方法。
        RaiseCallbackEvent  方法不仅需要处理 Identify 工具,还需要处理其他工具,本实例中包括关闭应用程序与获取版权文本。为了在该方法中判断是哪个工具启动了该方法调用,需要在传入在参数中包含表明调用“身份”。同时由于在传入参数中还需要其他可能更多的信息,例如Identify工具,不仅需要表明调用者身份的信息,还需要当前用户单击处 X、Y 坐标信息。为了能在RaiseCallbackEvent  方法中把这些信息都解释出来,本实例使用的是

        "参数名1=参数值1&参数名2=参数值2"

式。例如在 MapIdClick 函数中传入的是

        "ControlID=Map1&ControlType=Map&EventArg=MapIdentify&Map1_mode=MapIdentify
&minx="+zleft+"&miny="+ztop

而在 RaiseCallbackEvent 方法(或者是 RaiseCallbackEvent 中调用的 一个webservice方法,一个自定义类方法),通过调用 Split("&".ToCharArray ()) 方法将各个 “参数名=参数值” 放置到一组数组中,然后再通过建立哈希表的方式把“参数名” 与 “参数值” 分开,具体的代码如下:

            string [] keyValuePairs; // 含有”=“的数组
             string [] keyValue; // 只有字符串的数组
            NameValueCollection  m_queryString =   new  NameValueCollection (); // 键值对的集合

             keyValuePairs 
=  eventArgument.Split( " & " .ToCharArray ());//eventArgument是客户端传入的参数
             
if  (keyValuePairs.Length  >   0 ) // 如果传递的参数是argA=arg1&argB=arg2……形式的,也就是说参数不止一个
             {
                 
for  ( int  i  =   0 ; i  <  keyValuePairs.Length; i ++ )
                 {
                     keyValue 
=  keyValuePairs.GetValue(i).ToString().Split( " = " .ToCharArray());
                      m_queryString .Add(keyValue[
0 ], keyValue[ 1 ]);
                 }
             }
             
else // 传递的参数只有一个
             {
                 keyValue 
=  eventArgument.Split( " = " .ToCharArray());
                 
if  (keyValue.Length  >   0 ) // 如果有参数传递过来的话
                 {
                      m_queryString .Add(keyValue[
0 ], keyValue[ 1 ]);
                 }
             }
             
// 通过htQueryString["EventArg"]这种方式调用参数的值
              return   "您 选择的工具名称是:  "   +  m_queryString [ " EventArg " ].ToString()  ;

        通过执行上诉的代码后,只需要调用 m_queryString ["EventArg"]就能判断是哪个工具启动该方法的调用。如果是 Identify 工具,那么该值就为 MapIdentify 。
        在判断出调用工具是 Identify 后, RaiseCallbackEvent 方法调用 MapIdentify 类的 Identify 方法得到返回值。

        通过解析 Arcserver ADF 中的 Ajax ,就不难理解为什么利用 ArcServer ADF 开发的 webgis 产品中地图的刷新是如此之快了。。。。。。。。。。。。。

你可能感兴趣的:(arcgis)