adf中UpdatePanel刷新地图

在adf开发中,一般的工具可以使用adf的toolbar框架,实现IMapServerToolAction等接口来实现(这时也可以写自己的脚本,然后在tool的ClientAction中指定,这里有个技巧,可以通过'%toolbarItem%'作为参数传入脚本中,如:ClientAction="aaa('%toolbarItem%');",传入的是tool的名称)

但是一些交互性很强的工具,如果使用上面的方法就很麻烦,如要做一个arcmap里面的按照属性选择要素的工具,要多次跟服务器交互。

我想到的做法有2种,第一种是给每个要跟服务器交互的控件实现ajax操作,这种做法的坏处是所有操作的代码都得自己写,比如一次ajax请求中更新了某些控件的输出,这时就得自己实现修改控件的输出,好处是啥都是自己写的,也就啥得可以控制

第二种是使用updatepanel来处理交互,这种做法的好处是,updatepanel内的ajax处理就像我们一般写webform一样写就可以了,而不用自己更新控件的输出,但这时的问题是如何刷新地图,因为updatepanel只会刷新控件输出而不会刷新地图。

把map控件放在updatepanel中?这种想法只能说明没明白map是怎么刷新的。当我们实现IMapServerToolAction接口写一个工具的时候,可以调用Map.Refresh()来刷新地图,反编译可以看到Map的做法是 this.CallbackResults.Add(new CallbackResult(this, "invoke", new object[] { "refresh" }));,这句话把刷新地图这个callback加到callbackresults中,从命名就猜出来是回调,那么这个回调在哪里执行呢,查阅ESRI.ADF.System.Debug.js文件就可以发现processCallbackResult = ESRI.ADF.System.processCallbackResult = function (response, context)方法是用来处理CallbackResults的,里面也有invoke这种操作的处理。所以刷新地图需要调用map.refresh方法,并且在客户端调用处理callbackresults的js方法,如:ESRI.ADF.System.processCallbackResult,但updatepanel的js回调肯定是不会调用这个方法的。只要我们能够在updatepanel的ajax请求回调中调用ESRI.ADF.System.processCallbackResult 就可以让地图刷新了。

Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function () {})刚好就是用来在updatepanel的ajax请求回调中执行自定义js用的。

到此思路清晰了,只需要将map的callbakcreuslts转换成json字符串,传递给ESRI.ADF.System.processCallbackResult作为第一个参数就可以了

posted on 2011-06-16 11:20  漫步人生  阅读(534)  评论(0编辑  收藏  举报