Esri中国社区 » GIS大讲堂:ArcGIS Server .Net ADF中的AJAX
2011-02-14 20:51
686 查看
ArcGIS Server .Net ADF中的AJAX(一)
对于没有很好的
.net
编程基础,
arcobjects
的开发经验的开发人员而言,开发
arcgis server
的应用是比较费劲的。最简单和最快的学习之处就是先整清楚
esri
为我们提供的模板程序,别看这个功能简单的模板程序,里面包含了各种你开发
arcgis server
应用所需要的技术。
Ajax
技术就是其中之一。下面讲的东西在模版程序中都可以找到应用。
我们并不细究
ajax
复杂的技术本身,我们需要的仅仅是
ajax
技术在我们的
arcgis server
开发过程中是怎么具体发挥作用的,是具体怎么使用的。
Ajax
的定义
Ajax
是异步的
javascript
和
xml
的简称,它其实是老技术的一个新组合,因为
javascript
和
xml
都不是新技术,但是
ajax
的应用却给
web
应用带来了很多新的变化。
在
.net
中实现
ajax,
基本原理
在
.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
) %>
下面这个图示中就放在了
GetServerTime
这个客户端事件脚本中,下面这个图很好的说明了这整个过程,从这个过程中,大家并没有看到
GetCallbackEventReference
这个函数,而是
WebForm_DoCallback
函数,大家只要理解为
WebForm_DoCallback
是更底层的一个实现
ajax
的回调的函数就可以了。
理解
ajax
的基本原理,才能较好的理解
ajax
在
arcgis server.Net
中的应用。
ArcGIS Server .Net ADF中的AJAX(二)
对于没有很好的
.net
编程基础,
arcobjects
的开发经验的开发人员而言,开发
arcgis server
的应用是比较费劲的。最简单和最快的学习之处就是先整清楚
esri
为我们提供的模板程序,别看这个功能简单的模板程序,里面包含了各种你开发
arcgis server
应用所需要的技术。
Ajax
技术就是其中之一。下面讲的东西在模版程序中都可以找到应用。
我们并不细究
ajax
复杂的技术本身,我们需要的仅仅是
ajax
技术在我们的
arcgis server
开发过程中是怎么具体发挥作用的,是具体怎么使用的。
Ajax
的定义
Ajax
是异步的
javascript
和
xml
的简称,它其实是老技术的一个新组合,因为
javascript
和
xml
都不是新技术,但是
ajax
的应用却给
web
应用带来了很多新的变化。
在
.net
中实现
ajax,
基本原理
在
.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
) %>
下面这个图示中就放在了
GetServerTime
这个客户端事件脚本中,下面这个图很好的说明了这整个过程,从这个过程中,大家并没有看到
GetCallbackEventReference
这个函数,而是
WebForm_DoCallback
函数,大家只要理解为
WebForm_DoCallback
是更底层的一个实现
ajax
的回调的函数就可以了。
理解
ajax
的基本原理,才能较好的理解
ajax
在
arcgis server.Net
中的应用。
ArcGIS Server .Net ADF中的AJAX(二)
Ajax 在 ArcGIS Server 中的应用也是遵循基本的那几个步骤,但为什么使用起来的时候好像感觉摸不着头脑了呢?因为 .net ADF 提供了一个比较统一的框架,就把最基本的一些函数进行了包装,根据自己的模式提供了统一的入口和模式。但是只要再往下推敲几步就会发现熟悉的 ajax 的步骤了。这可能会让你在开始使用的时候会有些糊涂,但也正是这种统一的入口和模式让我们的工作变得简单。 ArcGIS Server .Net adf 提供了各种控件,这些控件里面都集中了复杂的功能,它们的刷新(比如地图的放大缩小,移动等等)都不是简单的几句 javascripts 能够完成的。这也就是为什么它提供了统一的入口和模式的原因了, web adf 已经帮你写好了很多的响应的 javascripts 的代码。你只需要按照相应的格式把刷新请求字符串返回客户端的相应函数, adf 提供的丰富的各种控件的刷新 javascripts 就能够帮你完成相应的刷新操作。但是尽管如此,你仍然有必要了解整个的过程。 1 在工具中使用 ajax ,这是最基本的模式 其中一种最常见的统一模式就是在工具中使用 ajax 了。 自定义工具大家都知道怎么实现了,有很多文档说明,大家都会在自定义工具的 SeverAction 类中来写很多功能,然后需要把结果返回到客户端去,那么这个过程中就会用到 ajax ,实现 ajax 的整个流程过程参见图 7-2 请仔细看附图, 1 页面加载以后,客户会在 map 上做操作,比如画矩形框,那么程序执行客户端的操作,比如 dragrectangle ,那就会激发 javascripts 目录下面的 MapMouseDown 函数,这个函数会开始绘制 rectangle ,在这个函数中,会去执行 postback 函数。 2 postback 函数中会执行 webForm_DoCallback 函数,这个函数把相应的请求发回到服务器端, WebForm_DoCallback('Map1',argument,processCallbackResult,context,postBackError,false) 3 到服务器端之后首先执行的是 map 控件的 RaiseCallbackEvent 函数, 4 进而会去调用用户自己写的工具的 ServerAction 函数,并把相应的返回字符串返回到客户端的 processcallbackresult .函数中,字符串类似于: Map:::Map1:::changelevel:::-1:::1:::1:::0:::0:::0:::0:::709:::389:::-1:::0:::0 5 这个过程到这里是不是完毕了呢,其实还没有,因为这个时候刷新的操作提示还没有做完, processcallbackresult 函数中还会有执行很多的 javascripts 函数,这些函数中还会嵌套有 ajax 的回调。但这个过程是最基础的过程。嵌套 ajax 的调用都只是重复这些步骤,然后调用的客户端的脚本函数和服务器的执行函数略有不同而已。 在上面的步骤中很多都是不需要我们进行干预的,所以我们只需要关心我们要做的事情就可以了,我们要做的就是 ServerAction 函数的功能,如果 ServerAction 中的功能都只是更新服务器端的内容,那就简单了,只需要使用 ao 组件进行执行就可以了,但是如果需要在 ServerAction 之后刷新客户端的内容的话,这个时候就需要注意了,千万不要忘记要把相应的字符串带到原来制定好的客户端的脚本中去。否则即使服务器的内容都已经更新了客户端却什么反应都没有了。 无论是客户端要刷新 arcgis server 的控件还是其他的控件,要返回的字符串都是 map. CallbackResults 中的字符串。因此需要你把想要更新到客户端的东西就都添加到 map.CallbackResults 里面去,否则无论你在服务器端做了什么客户端都看不到结果。很多人都不会忘记在服务端做工作,完成应该完成的事情,但是却容易忘记把相应的刷新字符串传到客户端。因为 b/s 的应用和 c/s 应用比起来,流程要复杂一些。 那么这里最重要的一个问题就是,需要把什么内容添加到 map.CallbackResults 中去呢。答案是一个字符串。 那么首先我们来看看字符串的解析函数,其次来看看构造这个字符串的规则。 1 ) 通过 Ajax 返回到客户端的字符串的响应函数详解 要在工具的 ServerAction 中通过 ajax 技术来在客户端来刷新 adf 中的 webcontrols ,那么返回字符串的第一个客户端的响应函数都是 processcallresult 。该函数 C:/Inetpub/wwwroot/aspnet_client/ESRI/WebADF/JavaScript 中的 display_dotnetadf.js 中。只有了解了这个函数是怎么来解析字符串的,我们才能知道我们应该怎么给这个字符串。 先说刷新 arcgis server 提供的控件, 先举一个例子,对 Map 控件进行一个放大操作,最后返回到 processcallresult 的 string : "Map:::Map1:::changelevel:::-1:::1:::1:::0:::0:::0:::0:::709:::389:::-1:::0:::0^^^Map:::Map1:::cleargrid" ^^^ 是操作分割符号, ::: 是参数分割符号, Processcallresult 函数中的解析代码 var ov2 = null; // 分割独立的操作 var pairs = response.split("^^^"); var actions; var o; var action; var c; var c; var resp; var validResponse = false; for (var i=0;i<pairs.length;i++) { // 进行参数的分割,并进行分析 actions = pairs .split(":::"); responseItem = pairs ; if (responseItem==null || responseItem.length==0) continue; controlType = actions[0].toLowerCase(); controlID = actions[1]; action = actions[2].toLowerCase(); switch (controlType) { case "map": map2 = Maps[controlID]; if (action=="changelevel") {……………………..} ………………………………… } 如果是刷新其他的asp.net的控件的话,情况就又不一样了。Processcallbackresult函数中有下面的解析代码,总体来说,刷新其他的asp.net的控件就直接把新的Html赋给相应的控件就可以了。如果传回来的是一串Javascrpts的话,就是让它直接运行就可以了。 ArcGIS Server .Net Web ADF的AJAX(二)续
|
相关文章推荐
- ArcGIS.Server.9.3.DotNet的ADF与ASP.NET AJAX
- 将[ESRI中国社区-GIS大讲堂]中Jueery关于ArcGIS Server的帖子内容整理成PDF发上来
- ArcGIS Server .Net ADF中的AJAX
- ArcGIS Server .NET ADF中的AJAX之深入浅出/CallbackResult详解
- (转)ArcGIS Server .NET ADF中的AJAX之深入浅出/CallbackResult详解
- ArcGIS Server .NET ADF中的AJAX之深入浅出/CallbackResult详解
- 未能加载文件或程序集''file:///C:/Program Files (x86)/ArcGIS/DeveloperKit10.0/DotNet/ESRI.ArcGIS.ADF.Local.dll'
- ArcGIS Server.Net Web ADF之几何类型的相互转换
- Arcgis Server ADF ajax前后台交互(备忘)
- 【2012Esri中国用户大会讲座】ArcGIS 10.1 for Server 安全机制(4)访问内容限制
- 未能加载文件或程序集“DeveloperKit10.1/DotNet/ESRI.ArcGIS.ADF.Local.或它的某一个依赖项
- ArcGIS Server .Net Web ADF之几何类型的相互转换
- 2014Esri全球用户大会之ArcGIS for Server&Portal for ArcGIS
- 【2012Esri中国用户大会讲座】ArcGIS 10.1 for Server 安全机制(1)用户角色权限
- ArcGIS Server .Net Web ADF体系结构
- ArcGIS Server .Net Web ADF的类库简介
- ArcGIS Server .Net Web ADF体系结构
- ArcGIS Server .Net Web ADF体系结构(转)
- 【2012Esri中国用户大会讲座】ArcGIS 10.1 for Server 安全机制(3)跨域访问限制
- 2013Esri全球用户大会Q&A之ArcGIS for Server&Portal for ArcGIS