|
|
|
|

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

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

作者:geospatialthinking来源:http://geospatialthinking.blogbus.com/|2009年12月22日
上篇我们介绍了ARCGIS Server9.3 AJAX的Client 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控件 (ScriptManager、UpdatePanel等服务器控件)和API管理异步通信,同时通过客户端的Microsoft AJAX Library动态更新前台页面。这就使得开发者甚至不用编写客户端脚本就能实现局部刷新。

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

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

如Client Callback一样,按触发的控件是否Web ADF,ASP.NET AJAX的使用情景也分两种:
一、Web ADF 触发局部页面回送
这种情景与Client Callback的第一种情景几乎一样。不同之处在于,ASP.NET AJAX通过将CallbackResults注册成items的形式由ScriptManager返回。


二、非Web ADF触发局部页面回送
在这种情景下,又有三种选择,分别是UpdatePanel,data items,dynamic script. blocks。每一种选择都是微软所支持的标准模式。前面提到将ADF放进UpdatePanel实现刷新将引起效率下降,因此主要看一下另两种选择

(1)dynamic script. blocks
ScriptManager允许在服务器端构建JavaScript函数块,在客户端运行。对于ADF的刷新,script. block一般会调用processCallbakResult函数来处理服务器端传来的CallbackResults。Note,在使用此方式时,页面中必须包含有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的请求响应示意图如下:

上一篇:ArcGIS Server9.3 AJAX系列(二)Client Ca…

下一篇:ArcGIS Server9.3 AJAX系列(四)之总结