写在前面,可能有点啰嗦,只是单纯的想实现异步刷新网页上map控件这样的一个功能,明明知道就目前的平台技术而言,仅仅就是一两句的代码,但是我还是浪费了两三天的时间在网上查找,而且收获甚微,最后还是看了ESRI的帮助文档才豁然开朗(本人英文差劲实在没办法的情况下才会去看英文档的 - -!)。Arcgis Server 的异步刷新是基于Ajax技术实现的,关于此类的文章不多,而且大多都是几年前介绍callbackresult 回调机制 等 Ajax原理的老贴,对于如同我一样,对js研究的不透彻,而且短时间就需要拿出项目解决方案的人来说,看的更是云里雾里。就目前而言基本上都是基于 vs2010 +arcgis server 10 甚至更高的版本,实际上要实现这样的功能已经非常的简单,当然原理机制如果理解的话会更好,此文的目的在于使用最简单的方法,来实现Arcgis server的异步刷新功能,不用填写太多的代码,也不用去管callbackresult之类的回调机制,希望 对于像我这样的新人有一个启示,对于现在使用 ArcGIS API for JavaScript 的人来说,本篇基本可以无视,因为不用去碰JavaScript完全只靠搭建几个控件就可以实现, 而对于.net 3.5之后,Ajax功能已经可以原生支持在vs平台上,我们实际上更喜欢不用了解更多的细节,使用ScriptManager和UpdatePanel 基本上就可以完成决大多数的页面异步刷新,而不用去在意Ajax是如何执行的,因为scriptManager已经帮助我们完成了后台的运作。
好了废话一大堆,正题:
环境就是vs2010 C# +arcgis 10 server
先说vs的异步刷新功能的实现主要就是ScriptManager和UpdatePanel 这方面那一本的.net 35之后的书籍都有介绍,实现起来非常的简单,不多说了,这有一篇介绍他们应用的不错:http://blog.csdn.net/luckypeng/article/details/8953373。
下面在说arcgis 的异步刷新,如果有兴趣研究一下原理的可以看一下此文:
http://blog.csdn.net/luckypeng/article/details/8958448 我认为这篇说的最好最深刻的一句话就是“谁请求,谁管理”完全的精髓要点啊。
gis 的ADF控件之间的刷新与控制,这个不多说了,比如map控制TOC只需要Map1.CallbackResults.CopyFrom(Toc1.CallbackResults); 就搞定了TOC的刷新。
我们实际应用中最关心的就是非ADF控件来控制的异步刷新。
(这里是官方帮助有兴趣的看一看吧ASP.NET AJAX partial postback solutions,How to manage callback content for Web ADF control when partial postback is initiated by Non-Web ADF control)
如果不使用.net 的Ajax控件,也就是ScriptManager的话,而采用ASP.NET的Client Callback方法这里就不说了。
而对于使用ScriptManager的话esri给出了几个解决方案:
1、使用UpdatePanels的方法;
如果将Web ADF控件放入UpdatePanel,则根据UpdatePanel的特性,会刷新里面整个Web ADF控件,这是不必要的,Web ADF控件所需要更新的内容仅仅是服务器端产生的CallbackResults,由客户端的processCallbackResult()即可完成,所以这个也就不说了。
2、作为dynamic script blocks:
因为“注册的dynamic script blocks会保存在客户端内存中,最终可能会导致浏览器内存超出限制”的弊端也不多说了。
3、把ADF控件注册为ScriptManager的data items方法;
举个例子这个方法如何实现,比如说我们网页上有一个asp Button1 来控制Map1控件加入一个图层,点击之后只需要map1控件自己刷新,前提是页面上已经存在了ScriptManager控件,并且ScriptManager必须为页面上的第一个控件。只需要三步
1)在网页中利用PageRequestManager捕捉pageLoading事件从而将注册成data items的控件实现局部异步刷新,只需要在网页前台代码部分插入以下代码:
2)在网页读入的时候注册需要控制实现异步刷新的控件
protected void Page_Load(object sender, EventArgs e)
{
ScriptManager1.RegisterAsyncPostBackControl(Button1);
}
3)需要控制局部刷新时候,只需要把要控制的GIS ADF控件注册成data items,比如此例子,处理完map1添加图层的代码后,在Button1点击事件里添加上这一句
ScriptManager1.RegisterDataItem(Page, Map1.CallbackResults.ToString(), false);
如果需要同时刷新其他的GIS ADF 控件比如说Toc控件只需执行ADF控件的 CallbackResults::CopyFrom方法
Toc1.Refresh();
Map1.CallbackResults.CopyFrom(Toc1.CallbackResults);
对于arcgis 的异步刷新的方法,只能采用使用.net Ajax控件和ASP.NET的Client Callback方法中俩者之一,如果页面上使用了ScriptManager控件,就只能使用这种方法,而大多数的情况下,同一张页面中我们不但要控制Arcgis ADF控件的异步刷新,还要控制非GIS ADF控件的异步刷新,所以使用ScriptManager控件的方法,是非常的简便便捷的。