ArcGIS Server .Net ADF中的AJAX(一)

对于没有很好的 .net 编程基础, arcobjects 的开发经验的开发人员而言,开发 arcgis server 的应用是比较费劲的。最简单和最快的学习之处就是先整清楚 esri 为我们提供的模板程序,别看这个功能简单的模板程序,里面包含了各种你开发 arcgis server 应用所需要的技术。 Ajax 技术就是其中之一。下面讲的东西在模版程序中都可以找到应用。

我们并不细究 ajax 复杂的技术本身,我们需要的仅仅是 ajax 技术在我们的 arcgis server 开发过程中是怎么具体发挥作用的,是具体怎么使用的。

Ajax 的定义
Ajax 是异步的 javascript 和 xml 的简称,它其实是老技术的一个新组合,因为 javascript 和 xml 都不是新技术,但是 ajax 的应用却给 web 应用带来了很多新的变化。

.net 中实现 ajax, 基本原理
在 .net 中有一个函数可以使用客户端的脚本调用服务器端指定的函数。也就是通过这个方法才实现了 .net 中页面的无回调刷新的。

public string GetCallbackEventReference (Control control,string argument,string clientCallback,string context)
参数:
control 处理客户端回调的服务器 Control 。该控件必须实现 ICallbackEventHandler 接口并提供 RaiseCallbackEvent 方法。
argument 从客户端脚本传递一个参数到服务器端的 RaiseCallbackEvent 方法。
clientCallback 一个客户端事件处理程序的名称,该处理程序接收服务器端事件返回的结果。
context 启动回调之前在客户端的客户端脚本信息。脚本的结果传回给客户端事件处理程序。
返回值 调用客户端回调的客户端函数的名称。
返回服务器端的响应函数是没有选择的。必须是服务器端的 RaiseCallbackEvent ,因此当一个页面中有多个地方需要回调的时候,就需要使用参数来区分。
客户端的响应函数使用 javascripts 来写,没有什么问题,在这里把返回的结果刷新出来。
服务器端的实现代码放在 RaiseCallbackEvent 中,也没有什么问题。
还有一个问题就是 GetCallbackEventReference 这个函数放在哪里,
一个位置是放在 page_load 中,
m_copyrightCallback = Page.ClientScript.GetCallbackEventReference(Page, "argument" , "processCallbackResult" , "context" , true );
另一个就是直接放在客户端的事件当中。

<%=ClientScript.GetCallbackEventReference( this , "imagechange" , "ShowServerTime2" , null ) %>

下面这个图示中就放在了 GetServerTime 这个客户端事件脚本中,下面这个图很好的说明了这整个过程,从这个过程中,大家并没有看到 GetCallbackEventReference 这个函数,而是 WebForm_DoCallback 函数,大家只要理解为 WebForm_DoCallback 是更底层的一个实现 ajax 的回调的函数就可以了。
理解 ajax 的基本原理,才能较好的理解 ajax 在 arcgis server.Net 中的应用。

ArcGIS Server .Net ADF中的AJAX(二)

Ajax 在 ArcGIS Server 中的应用也是遵循基本的那几个步骤,但为什么使用起来的时候好像感觉摸不着头脑了呢?因为 .net ADF 提供了一个比较统一的框架,就把最基本的一些函数进行了包装,根据自己的模式提供了统一的入口和模式。但是只要再往下推敲几步就会发现熟悉的 ajax 的步骤了。这可能会让你在开始使用的时候会有些糊涂,但也正是这种统一的入口和模式让我们的工作变得简单。

ArcGIS Server .Net adf 提供了各种控件,这些控件里面都集中了复杂的功能,它们的刷新(比如地图的放大缩小,移动等等)都不是简单的几句 javascripts 能够完成的。这也就是为什么它提供了统一的入口和模式的原因了, web adf 已经帮你写好了很多的响应的 javascripts 的代码。你只需要按照相应的格式把刷新请求字符串返回客户端的相应函数, adf 提供的丰富的各种控件的刷新 javascripts 就能够帮你完成相应的刷新操作。但是尽管如此,你仍然有必要了解整个的过程。
1 在工具中使用 ajax ,这是最基本的模式
其中一种最常见的统一模式就是在工具中使用 ajax 了。
自定义工具大家都知道怎么实现了,有很多文档说明,大家都会在自定义工具的 SeverAction 类中来写很多功能,然后需要把结果返回到客户端去,那么这个过程中就会用到 ajax ,实现 ajax 的整个流程过程参见图 7-2
请仔细看附图,

1 页面加载以后,客户会在 map 上做操作,比如画矩形框,那么程序执行客户端的操作,比如 dragrectangle ,那就会激发 javascripts 目录下面的 MapMouseDown 函数,这个函数会开始绘制 rectangle ,在这个函数中,会去执行 postback 函数。
2  postback 函数中会执行 webForm_DoCallback 函数,这个函数把相应的请求发回到服务器端,

WebForm_DoCallback('Map1',argument,processCallbackResult,context,postBackError,false)
3   到服务器端之后首先执行的是 map 控件的 RaiseCallbackEvent 函数,
4    进而会去调用用户自己写的工具的 ServerAction 函数,并把相应的返回字符串返回到客户端的 processcallbackresult .函数中,字符串类似于:
Map:::Map1:::changelevel:::-1:::1:::1:::0:::0:::0:::0:::709:::389:::-1:::0:::0
5  这个过程到这里是不是完毕了呢,其实还没有,因为这个时候刷新的操作提示还没有做完, processcallbackresult 函数中还会有执行很多的 javascripts 函数,这些函数中还会嵌套有 ajax 的回调。但这个过程是最基础的过程。嵌套 ajax 的调用都只是重复这些步骤,然后调用的客户端的脚本函数和服务器的执行函数略有不同而已。

在上面的步骤中很多都是不需要我们进行干预的,所以我们只需要关心我们要做的事情就可以了,我们要做的就是 ServerAction 函数的功能,如果 ServerAction 中的功能都只是更新服务器端的内容,那就简单了,只需要使用 ao 组件进行执行就可以了,但是如果需要在 ServerAction 之后刷新客户端的内容的话,这个时候就需要注意了,千万不要忘记要把相应的字符串带到原来制定好的客户端的脚本中去。否则即使服务器的内容都已经更新了客户端却什么反应都没有了。
无论是客户端要刷新 arcgis server 的控件还是其他的控件,要返回的字符串都是 map. CallbackResults 中的字符串。因此需要你把想要更新到客户端的东西就都添加到 map.CallbackResults 里面去,否则无论你在服务器端做了什么客户端都看不到结果。很多人都不会忘记在服务端做工作,完成应该完成的事情,但是却容易忘记把相应的刷新字符串传到客户端。因为 b/s 的应用和 c/s 应用比起来,流程要复杂一些。
那么这里最重要的一个问题就是,需要把什么内容添加到 map.CallbackResults 中去呢。答案是一个字符串。

那么首先我们来看看字符串的解析函数,其次来看看构造这个字符串的规则。
1 ) 通过 Ajax 返回到客户端的字符串的响应函数详解
要在工具的 ServerAction 中通过 ajax 技术来在客户端来刷新 adf 中的 webcontrols ,那么返回字符串的第一个客户端的响应函数都是 processcallresult 。该函数 C:/Inetpub/wwwroot/aspnet_client/ESRI/WebADF/JavaScript 中的 display_dotnetadf.js 中。只有了解了这个函数是怎么来解析字符串的,我们才能知道我们应该怎么给这个字符串。
先说刷新 arcgis server 提供的控件,
先举一个例子,对 Map 控件进行一个放大操作,最后返回到 processcallresult 的 string :
"Map:::Map1:::changelevel:::-1:::1:::1:::0:::0:::0:::0:::709:::389:::-1:::0:::0^^^Map:::Map1:::cleargrid"
^^^ 是操作分割符号, ::: 是参数分割符号,
Processcallresult 函数中的解析代码
var ov2 = null;
// 分割独立的操作
var pairs = response.split("^^^");
var actions;
var o;
var action;
var c;
var c;
var resp;
var validResponse = false;
for (var i=0;i<pairs.length;i++)
{
// 进行参数的分割,并进行分析
actions = pairs

.split(":::");
responseItem = pairs ;
if (responseItem==null || responseItem.length==0)
continue;
controlType = actions[0].toLowerCase();
controlID = actions[1];
action = actions[2].toLowerCase();
switch (controlType) {
case "map":
map2 = Maps[controlID];
if (action=="changelevel")
{……………………..}
…………………………………
}
如果是刷新其他的asp.net的控件的话,情况就又不一样了。Processcallbackresult函数中有下面的解析代码,总体来说,刷新其他的asp.net的控件就直接把新的Html赋给相应的控件就可以了。如果传回来的是一串Javascrpts的话,就是让它直接运行就可以了。

ArcGIS Server .Net Web ADF的AJAX(二)续

2) 构造返回字符串的规则
当然除了研究Processcallbackresult这个函数来确定我们应该怎么来构造返回的字符串之外,ESRI也给出了相应的说明,见下表。
如果是刷新adf提供的webcontrols的内容的话,那么字符串的构建就比较简单,都是通过webcontrol自动生成的,但是如果刷新的内容普通的asp.net控件的话,那么就需要按照需求手动来构造返回字符串,如果返回的是javascript的话也是一样的。下面是如果返回的参数是用来刷新普通的asp.net控件或者是Javascripts的话,会要求使用到下面的几类参数:

“ content"

Used to set the outerHTML property of an html element. The html element on the client defined by the CallbackResult 抯 controlType and controlID is completely replaced by the html content provided as a parameter in the object array (object[]).

"innercontent"

Used to set the innerHTML property of an html element. The content inside the html element on the client defined by the CallbackResult 抯 controlType and controlID is completely replaced by the html content provided as a parameter in the object array (object[]).

"image"

Used to set the src property of an image element. The source of the image element on the client defined by the CallbackResult 抯 controlType and controlID is changed to the url string provided as a parameter in the object array (object[]).

"javascript"

Used to execute JavaScript on the client. The CallbackResult 抯 controlType and controlID and set to null. The JavaScript code is provided as a parameter in the object array (object[]).

Conent是返回设置给html控件的outerhtml属性。
Innercontent是返回给html控件的innerhtml属性。
Javascrpt是返回一段javascripts.
从上面的构造字符串中可以看出,返回到客户端的字符串可以用来刷新一个控件,也可以是直接返回一段javascript,这样我们就可以很灵活的来控制客户端的一些界面,对于content或者innercontent的内容的构造一般都是通过控件直接生成的,而javascriptes一般都是直接在函数中自己构造的。
下面是在具体使用过程中的经常会涉及到的两个例子,也就是要在自定义的工具中要实现的ajax刷新的代码例子。

1 在map刷新的同时也刷新其他的arcgis server的web控件,
下面是刷新toc控件的相关代码,

ESRI.ArcGIS.ADF.Web.UI.WebControls.Toc
toc1 = (ESRI.ArcGIS.ADF.Web.UI.WebControls.Toc )map.Page.FindControl("Toc1" );
toc1.Nodes.Clear();
toc1.Refresh();
string aaa = toc1.CallbackResults.ToString();
CallbackResult tocstring = new CallbackResult ("TOC" , "Toc1" , "content" , aaa);
map.CallbackResults.Add(tocstring);

2 在map刷新的同时也刷新其他的asp.net的控件,下面是一段例子代码,刷新的是一个div控件

DataTableCollection dtc = dataset.Tables;
string returnstring = string .Empty;
foreach (DataTable dt in dtc)
{
if (dt.Rows.Count == 0)
continue ;
GridView gd = new GridView ();
gd.ToolTip = dt.TableName;
gd.Caption = dt.TableName;
gd.DataSource = dt;
gd.DataBind();
gd.Visible = true ;

gd.BorderWidth = 10;

using (System.IO.StringWriter sw = new System.IO.StringWriter ())
{
HtmlTextWriter htw = new HtmlTextWriter (sw);
gd.RenderControl(htw);
htw.Flush();
returnstring = returnstring + sw.ToString();

}
}
CallbackResult cr = new CallbackResult ("div" , "datadiv" , "innercontent" , returnstring);

map.CallbackResults.Add(cr);

ArcGIS Server .Net ADF中的AJAX(三)

直接在页面中使用ajax来刷新arcgis server的控件

这种情况的执行思路和原理看附件流程图

这种情况下也会有刷新arcgis server控件和普通的asp.net两种情况,这两种情况的区别和上一节的内容一样。

图7-3

1 ) 直接在map的客户端事件中来实现arcgis server的ajax刷新

protected void Map1_DragRectangle( object sender, ESRI.ArcGIS.ADF.Web.UI.WebControls. ToolEventArgs args)

{

CallbackResult cr = new CallbackResult ( null , null , "javascript" , "showFloatingPanel('FloatingPanel1')" );

Map1.CallbackResults.Add(cr);

}

2 ) 直接在html的控件的事件中来使用ajax进行刷新,这种情况下客户端的响应函数是processCallbackResult,服务器端的处理函数是page的RaiseCallbackEvent函数。

function Button2_onclick()

{

eval( "WebForm_DoCallback('__Page','jintian', processCallbackResult,'jintian',null,true)" );

}

Esri中国社区 » GIS大讲堂:ArcGIS Server .Net ADF中的AJAX相关推荐

  1. 在ARCGIS SERVER 9.2中动态增加图层(附代码)

    前天被这个问题弄得糊里糊涂,看这里还有人跟我一样痛苦,所以把代码贴出来. ESRI. ArcGIS.ADF.Web.DataSources. ArcGISServer.MapResourceLocal ...

  2. 何修改基于ArcGIS Server .NET ADF确良9.3的WEB SERVER端口使ArcGIS Server Manager来创建WEB应用的注意事项...

    1在IIS中修改TCP的端口号,比如:8080 2在安装的目录下donet的目录下的AddInstance程序,点"修改",删除原来的SERVER Instance 3把新的Ins ...

  3. [转载]通过Arcgis Server向MXD中添加图层

    原文链接:http://blog.sina.com.cn/s/blog_4c8b9c240100i9kk.html 转载于:https://www.cnblogs.com/frostbelt/arch ...

  4. Java ADF开发入门-简单ArcGIS Server Web ADF应用

    转载于:https://www.cnblogs.com/fsyiyun/archive/2009/05/29/3947010.html

  5. ArcGIS Server 9.3 安装步骤及相关注意事项

    ArcGIS Server 9.3 安装步骤及相关注意事项 2010年08月02日 Made By QCPassed 题目:ArcGIS Server 9.3(.net)安装步骤及相关注意事项 平台: ...

  6. 《精通ArcGIS Server 应用与开发》——第 1 章 ArcGIS 10简介1.1 ArcGIS 10体系结构1...

    本节书摘来自异步社区<精通ArcGIS Server 应用与开发>一书中的第1章,第1.1节,作者: 何正国 , 杜娟 , 毛海亚 更多章节内容可以访问云栖社区"异步社区&quo ...

  7. 针对ArcGIS Server 跨域问题的解释

    在博客Hello World文章中提起过,以前在sinaapp中建立过wordpress博客,也写过一篇关于ArcGIS JavaScript API的文章,但是由于sinaapp开始收费以后,我的个 ...

  8. ArcGIS Server常见问题集锦(转载)

    ArcGIS Server常见问题集锦(转载) 安装部署问题 1 用户名问题    在GIS Server PostInstall过程中会涉及到两个用户,默认情况下一个ArcGISSOM,一个是Arc ...

  9. ArcGIS Server 简介

    ArcGIS Server ArcGIS Server--企业级GIS服务器 产品概况 关键特征 扩展模块 常见问题 ArcGIS Server--企业级GIS服务器 ArcGIS Server是一个 ...

  10. ArcGIS Server 中AJAX应用系列(3)

    本文部分取自ESRI翻译部分及网络,其他文字版权归小能所有,转载麻烦标明出处,谢谢! 写作过程中也参阅了大量其他网络文档,如果您觉得侵犯版权,请和我联系:chinazhousheng@gmail.co ...

最新文章

  1. Leetcode: Sort List
  2. 墨刀未能成功读取服务器数据,墨刀的使用
  3. sharepoint 2010 beta Workflow
  4. mysql 编译cpu数量_合适MySQL的Xeon 55XX系列CPU编译参数
  5. 0. 导读 每个学习过线性代数的人,心中一定充满疑问,往往百思难得其解,本书列举一些,并且自然而然地解决了这些问题,
  6. String.prototype.substr()
  7. 鸡蛋掉落(动态规划)
  8. 8255工作方式一A口和B口输出
  9. Android-关于屏幕适配的一些经验
  10. (转)区块链:为什么说finchain是下一代金融应用平台
  11. 在哪里可以找水系图_请问在哪可以找到广西的水系图
  12. MySQL 操作语句大全(详细)
  13. js-showModalDialog和dialogArguments
  14. vs2005+sql2005的新一天
  15. 如何在线批量将PDF转换成JPG格式
  16. 阿里云centos7系统下载
  17. 链路追踪Zipkin
  18. 一之续、A*,Dijkstra,BFS算法性能比较及A*算法的应用
  19. O2O之下,腾讯觊夺移动支付大数据,手Q支付出战支付宝
  20. LabVIEW FPGA PCIe开发讲解-7.1节:FPGA PCIe/PXIe基础知识和概念概述

热门文章

  1. 推到 旋转矩阵公式_想知道旋转矩阵的带入公式
  2. SVM 多分类 -SVM分类opencv3.0源代码
  3. RHCSA红帽认证考试题库--上午考试题
  4. SQL中的日期差函数
  5. 企业微信hook,企业微信软件
  6. 关于 com.lowagie.text 报错的问题
  7. 【CNN回归预测】基于matlab卷积神经网络CNN数据回归预测【含Matlab源码 2003期】
  8. Gartner首发中国数据库市场指南,巨杉数据库代表数据库领域厂商入选
  9. TTL电平和CMOS电平的区别及其应用
  10. 基于stc15f2k60s2芯片单片机编程(按键的长短按)