ArcGIS Server 无刷回调 (转)

转自: http://bbs.esrichina-bj.cn/ESRI/thread-55413-1-1.html

先不说象ADF和AO这样的东西,要做ArcServer开发,首先要明白地图怎样无刷的,怎么回调的。在说之前先介绍一个.net Framwork里面的一个接口。System.Web.UI.ICallbackEventHandler,这是.net中实现页面无刷的接口,而ArcServer就是靠这个接口来实现的无刷。
这个接口主要有两个方法要我们实现:
1.
string ICallbackEventHandler.GetCallbackResult()这个方法可以返回我们将要发送到客户端解析的字符串,返回的字符串要靠前台的JavaScript解析,才能反应到前台页面上。
2.
void ICallbackEventHandler.RaiseCallbackEvent(string eventArgument)这个方法主要是后台逻辑程序,即在服务器端运行的主要的逻辑代码所在地。也就是在此方法内获得要返回到客户端的字符串,然后把这些字符串赋值给一个全局变量,返回到上一个方法中,通过上一个方法返回到客户端。其中eventArgument参数就是前台传过来的message参数,也是字符串格式,然后再在服务器端把字符串解析,执行相应的方法。
以上主要是说的服务器端,下面再来解释一下客户端。在客户端主要就是javaScript脚本代码,这个曾经每人冷落的技术正是今天的ajax无刷技术的主角。
主要包括三个方法:

1.
function getServerTime()


{
           var message = 'getservertime';


           var context = 'Page1';
<%=sCallBackFunctionInvocation%>

}
脚本执行的入口方法,例如,可以在一个button click事件中执行该方法。其中message就是我们在服务器端解析的eventArgument参数。Context就是我们要刷新的控件。而第三行就把我们的执行行转移到了服务器端。
2.
functionprocessMyResult(returnmessage, context)

{
             var timediv = document.getElementById('timelabel');

timediv.innerHTML = returnmessage;

}
这个方法主要就是执行完服务器代码以后,用来解析服务器返回的字符串。Returnmessage就是服务器return的字符串,context就是上个字符串传入的要刷新的控件。

3.
function postMyError(returnmessage, context)

{

alert(
"Callback Error: " + returnmessage + ", "+ context);

}

当服务器执行回调失败执行的客户端方法

到目前为止,我们的回调客户端和服务器端都有了,那是什么把客户端和服务器端联系起来的呢?是sCallBackFunctionInvocation这个全局变量这是服务器端的一个全局变量,其定义为sCallBackFunctionInvocation = Page.ClientScript.GetCallbackEventReference(this, "message", "processMyResult", "context", "postMyError", true);
第一个参数就是处理客户端回调的服务器 Control。该控件必须实现 ICallbackEventHandler 接口并提供 RaiseCallbackEvent 方法。
第二个参数从客户端传递到服务器端的参数,服务器端对此参数进行解析,得到可用的信息。
第三个参数是客户端的一个脚本方法,用来接受服务器处理完传回的结果,解析该结果,并作出相应的动作。
第四个参数是启动回调之前在客户端的客户端脚本信息。脚本的结果传回给客户端事件处理程序。


第五个参数是回调任务执行失败后执行的脚本方法。

介绍完无刷之后,我们怎么在ArcServer中使用这些无刷呢?
1.
在工具中。

这是最简单的,也是最好理解(好理解并不等于理解透彻了)。在定制工具时除了名称,显示文本,各种状态下的图片已经toolTip等属性外,还有ClinetAction和ServerAction。这两个东西是这个工具的关键。顾名思义,clientAction就是客户端触发的动作,ServerAction就是服务器端触发的动作。例如画线,ClinetAction就要选择polyLine。服务器端也会选择继承ToolServerAction接口的类,在此类的serverAction中编写服务器要执行的方法。当用户执行此工具时,就会调用javaScript画线,等画完以后,系统就会带着客户端执行画线操作所产生的结果作为参数执行服务器端的代码。最后执行完以后callback一下,客户端脚本就会去自动的去解析服务器端执行完返回的字符串。接着刷新相应的界面。

但至始至终,在这个过程中,我们似乎没有写一句javaScript代码,那客户端执行的代码,传递的参数以及服务器返回的字符串的解析又是由谁来完成的呢?原来ArcServer预先给我们定义了一些JavaScript代码。C:\Inetpub\wwwroot\aspnet_client\ESRI\WebADF\JavaScript,一般会保存在这个文件夹里面,这里面既有客户端画线代码,又有解析服务器端返回的字符串的代码。要只要,googleMap局部刷新的实现也用了近万行javaScript代码,可见JavaScript在WebGIS中的重要性。
2.
点击按钮等普通命令回调刷新

这种方式和上面方式的区别就是要自己要写解析处理服务器返回字符串,自己去解析,去到客户端去执行,当然这里的自己去解析不是让我们非得去解析所有的字符串,象返回的html代码或是javaSript脚本,本身浏览器就可以解析,我们自己把这些东西交给浏览器就行了。

下面就就介绍一下如何构造返回的字符串,要想在客户端把这些字符串解析出来,肯定得有构造的规则,产生字符串的服务器端以及解析字符串的客户端都遵循这个字符串构造规则,这样的话才能达到两端的同步工作。
1.
首先第一种构造方式是刷新ADF自身带的控件,如TOC等,这些控件都有自己的返回字符串构造规则,ESRI已经为我们封装好了。所以只要调用一下控件的CallBack.toString ()方法,然后添加到Map的CallBack中就可以了。客户端就会自动解析,刷新要刷新的控件。

2.
第二种就是刷新其他的Asp.net控件。这个就较复杂一点,要让这些控件和ADF中的同步刷新,而其本身又不是ADF中的东西,这种情况下,字符串就靠我们自己去构造。不过构造的客户端能够解析才行。下面就是ADF帮助中的返回的字符串构造规则。


“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[]).

“content"

用于设置一个HTML元素的outerHTML属性。在CallbackResult 定义了要操作的控件的类型,id号放到刷新的方法参数中。

"innercontent"

用来定义一个html的innerHTML属性。定义好html元素中要显示的内容,以及将要被替换的内容的元素类型,元素的id号作为参数,放到CallbackResult中。
"image"

用来定义一个image元素的src(资源)属性.定义好图片资源,以及要改变资源的图片元素类型,元素id号,然后作为参数添加到CallbackResult中。
"javascript"

用于在客户端执行JavaScript,参数元素类型以及元素编号都设置为null。javaScript代码就作为参数添加到CallbackResult中。

原文地址:https://www.cnblogs.com/holygis/p/2030077.html