惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

M
MIT News - Artificial intelligence
雷峰网
雷峰网
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Last Week in AI
Last Week in AI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
阮一峰的网络日志
阮一峰的网络日志
月光博客
月光博客
博客园 - Franky
腾讯CDC
T
Tailwind CSS Blog
Recent Announcements
Recent Announcements
V
V2EX
N
Netflix TechBlog - Medium
量子位
Jina AI
Jina AI
Y
Y Combinator Blog
The GitHub Blog
The GitHub Blog
G
Google Developers Blog
爱范儿
爱范儿
博客园 - 叶小钗
D
Docker
MongoDB | Blog
MongoDB | Blog
D
DataBreaches.Net
T
The Blog of Author Tim Ferriss

博客园 - 漫步人生

c# 使用GetOleDbSchemaTable获取access数据库结构 xp上vs2010+IE8无法调试脚本 iis 上部署asp.net程序出错排查 windows2008的共享 使用sqlite绿色部署问题 在vs中使用正则表达式 事件不应该有返回值 ae的com对象在dotnet中的释放问题 adf for dotnet中servercontext的释放 修改Windows中ASPNET账户的密码 ae显示arcserver的地图服务 arcgis 编辑时独占mdb adf for dotnet中动态给ArcGis Server服务添加图层 js中在不知道属性名时获取属性对象 html文档中的name属性 ie中js a光标位置 windows局域网内以arcgis server local的方式连接arcserver服务器 c#与 如何调试 C#与C/C++的互操作
adf中UpdatePanel刷新地图
漫步人生 · 2011-06-16 · via 博客园 - 漫步人生

在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作为第一个参数就可以了