『公告』 预祝您龙年大吉,万事如意, 过节期间, 大家如需数据服务,请拨打400 或直接添加客服微信,再祝大家龙年,心想事成。
关注我们 新浪 腾讯

ArcGIS Server9.3 AJAX系列(三)之ASP.NET AJAX解决方案

ArcGIS Server9.3 AJAX系列(三)之ASP.NET AJAX解决方案
上篇我们介绍了ArcGIS Server9.3 AJAX的Client Callback解决方案。这一方案是92版本所支持的,在最近的93版本中仍然支持。不过93版本又支持另一种最新的AJAX解决方案,我们称之为ASP.NET AJAX解决方案。

       上篇我们介绍了ArcGIS Server9.3 AJAXClient Callback解决方案。这一方案是92版本所支持的,在最近的93版本中仍然支持。不过93版本又支持另一种最新的AJAX解决方案,我们称之为ASP.NET AJAX解决方案。

       注:EDN帮助文档上称之为ASP.NET AJAX partial postback solutions,其实就是对应着ASP.NET AJAX技术。

       2007年的时候微软发布了ASP.NET AJAX开发框架,VS2008中默认安装,该框架提供了一个完整的客户端——服务器异步通信的方案。AJAX框架提供了一组AJAX控件 (ScriptManagerUpdatePanel等服务器控件)API管理异步通信,同时通过客户端的Microsoft AJAX Library动态更新前台页面。这就使得开发者甚至不用编写客户端脚本就能实现局部刷新。

       产生局部页面回送(partial page postback)的控件我们称之为触发器,它必须支持IPostBackEventHandlerIPostBackDataHandlerINamingContainer接口,并且由ScriptManager注册。Web ADF空间事实上大都继承了IPostBackEventHandler接口,也都被ScriptManager所注册,比如MapOverviewMapToolbar等。而TOC有些不同,它继承了PostBackControl类,该类实现了IPostBackEventHandler接口。值得一提的是,页面中存在ScriptManager时,Web ADF会选择partial postback解决方案。

       关于UpdatePanelWeb ADF,有几点需要再强调一下。一,我们常将服务器控件放在UpdatePanel中以实现局部页面刷新(partial page rendering)。事实上,我们也可以将它们放在UpdatePanel外,这种方式只需要在页面载入时用ScriptManager注册触发回送的控件就可以了。二,Web ADF已经包含了SciptManager的注册、触发回送的事件以及如何更新客户端的页面内容,因此ADF不需要用UpdatePanel包含。更糟糕的是,如果将ADF放进UpdatePanel中,将会降低效率。因此,我们极力不推荐将ADF放在UpdatePanel里。

       如Client Callback一样,按触发的控件是否Web ADFASP.NET AJAX的使用情景也分两种:

       一、Web ADF 触发局部页面回送

       这种情景与Client Callback的第一种情景几乎一样。不同之处在于,ASP.NET AJAX通过将CallbackResults注册成items的形式由ScriptManager返回。

       二、非Web ADF触发局部页面回送

       在这种情景下,又有三种选择,分别是UpdatePaneldata itemsdynamic script. blocks。每一种选择都是微软所支持的标准模式。前面提到将ADF放进UpdatePanel实现刷新将引起效率下降,因此主要看一下另两种选择

       (1)dynamic script. blocks

       ScriptManager允许在服务器端构建JavaScript函数块,在客户端运行。对于ADF的刷新,script. block一般会调用processCallbakResult函数来处理服务器端传来的CallbackResultsNote,在使用此方式时,页面中必须包含有UpdatePanel控件,但UpdatePanel可以为空。

       这种方法的缺陷在于需要对CallbackResult进行转义字符的转换,而在C#VB.NET中并不相同,需要注意。另一个可能的缺陷在于所有的registed script. blocks都会贮存于内存,有可能会导致不必要的问题。

       这种方法也有一些好处。一个是不需要像UpdatePanel那样实现完全刷新,只部分刷新需要更新的项目。另一个好处在于不需要定制客户端的处理代码,可以都交由processCallbakResult函数来处理。

       (2)data items

       该方法需要先插入一段自定义的JavaScript函数用来注册data item的异步响应处理函数,该函数会将服务器传来的data items传送给processCallbackResult函数来处理。JavaScript函数如下所示:

       <script>                              

       Sys.Application.add_init(onInitFunction);                                      

       // Called once during application initialization

       function onInitFunction()

       {

       Sys.WebForms.PageRequestManager.getInstance().add_pageLoading(AsyncResponseHandler);

       }

 

       // Called whenever a response to a partial postback is processed on the client

       function AsyncResponseHandler(sender, args)

       {

       var dataItems = args.get_dataItems();

       if (dataItems['__Page'] != null)

       ESRI.ADF.System.processCallbackResult(dataItems['__Page']);

       }

       </script> 

       另外,对每一个data item,都需要ScriptManager注册,例如:

       ScriptManager1.RegisterDataItem(Page, Map1.CallbackResults.ToString(), false);

       data item的请求响应示意图如下:


      京ICP备2025132830号-1 京公网安备 号