ArcGIS Server .Net ADF中的AJAX

前端之家收集整理的这篇文章主要介绍了ArcGIS Server .Net ADF中的AJAX前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

ArcGIS Server .Net ADF中的AJAX(一)

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


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

Ajax的定义
Ajax是异步的javascriptxml的简称,它其实是老技术的一个新组合,因为javascriptxml都不是新技术,但是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",0)">"processCallbackResult""context"true);
另一个就是直接放在客户端的事件当中。

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


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


ArcGIS Server .Net ADF中的AJAX(二)

AjaxArcGIS 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控件进行一个放大操作,最后返回到processcallresultstring
"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 CallbackResultcontrolType 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 CallbackResultcontrolType 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 CallbackResultcontrolType 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 CallbackResultcontrolType 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();

stringaaa = toc1.CallbackResults.ToString();

CallbackResulttocstring =newCallbackResult("TOC","Toc1",0)">"content",aaa);

map.CallbackResults.Add(tocstring);

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


DataTableCollectiondtc = dataset.Tables;
stringreturnstring =string.Empty;

foreach(DataTabledtindtc)

{

if(dt.Rows.Count == 0)

continue;

GridViewgd =GridView();

gd.ToolTip = dt.TableName;

gd.Caption = dt.TableName;

gd.DataSource = dt;

gd.DataBind();

gd.Visible =true;


gd.BorderWidth = 10;


using(System.IO.StringWritersw =newSystem.IO.StringWriter())

{

HtmlTextWriterhtw =HtmlTextWriter(sw);

gd.RenderControl(htw);

htw.Flush();

returnstring = returnstring + sw.ToString();


}

}

CallbackResultcr ="div",0)">"datadiv",0)">"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刷新


protectedvoidMap1_DragRectangle(objectsender,ESRI.ArcGIS.ADF.Web.UI.WebControls.ToolEventArgsargs)


{

CallbackResult(null,"javascript",0)">"showFloatingPanel('FloatingPanel1')");


Map1.CallbackResults.Add(cr);

}


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


functionButton2_onclick()

{

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

}

猜你在找的Ajax相关文章