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() ;
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 产品中地图的刷新是如此之快了。。。。。。。。。。。。。