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)");

}

ArcGIS Server .Net ADF中的AJAX的更多相关文章

  1. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  2. HTML5数字输入仅接受整数的实现代码

    这篇文章主要介绍了HTML5数字输入仅接受整数的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. amaze ui 的使用详细教程

    这篇文章主要介绍了amaze ui 的使用详细教程,本文通过多种方法给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  4. html5简介_动力节点Java学院整理

    这篇文章主要介绍了html5简介,用于指定构建网页的元素,这些元素中的大多数都用于描述网页内容,有兴趣的可以了解一下

  5. 如何在iOS中检测文本(字符串)语言?

    例如,给定以下字符串:我想检测每个声明的字符串中使用的语言.让我们假设已实现函数的签名是:如果没有检测到语言,则返回可选字符串.因此,适当的结果将是:有一个简单的方法来实现它吗?

  6. ios 8 Homescreen webapp,关闭和打开iPad停止javascript

    我有一个适用于iPad的全屏HTML5网络应用程序,并且刚刚安装了IOS8来试用它,它一切正常,直到你关闭并重新启动iPad.一旦web应用程序重新启动javascript就会停止并加载新页面不会重新启动它.在iPad上的Safari中打开同一页面时,关闭和打开iPad会继续按预期工作.其他人注意到了这个或想出了一个解决方案吗?解决方法这似乎是我在iOS8.1.1更新中解决的.

  7. iOS 6 javascript与object.defineProperty的间歇性问题

    当访问使用较新的Object.defineProperty语法定义属性的对象的属性时,有没有其他人注意到新iOS6javascript引擎中的间歇性错误/问题?https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty我正在看到javascript失败的情况,说

  8. ios – 如何使用JSExport导出内部类的方法

    解决方法似乎没有办法将内部类函数导出到javascript.我将内部类移出并创建了独立的类,它起作用了.

  9. 静音iOS推送通知与React Native应用程序在后台

    我有一个ReactNative应用程序,我试图获得一个发送到JavaScript处理程序的静默iOS推送通知.我看到的行为是AppDelegate中的didReceiveRemoteNotification函数被调用,但是我的JavaScript中的处理程序不会被调用,除非应用程序在前台,或者最近才被关闭.我很困惑的事情显然是应用程序正在被唤醒,并且它的didReceiveRemoteNotifi

  10. ios – 内存泄漏与UIWebView和Javascript

    清楚地包含一个Javascript文件到我的HTML是使UIWebView泄漏内存.当我重复使用相同的UIWebView对象时,或者每当我有内容实例化一个新的漏洞时,会出现泄漏的事实,导致我认为必须有一些JavaScript文件被loadHTMLString处理,导致泄漏.有人知道如何解决这个问题吗?

随机推荐

  1. xe-ajax-mock 前端虚拟服务

    最新版本见Github,点击查看历史版本基于XEAjax扩展的Mock虚拟服务插件;对于前后端分离的开发模式,ajax+mock使前端不再依赖后端接口开发效率更高。CDN使用script方式安装,XEAjaxMock会定义为全局变量生产环境请使用xe-ajax-mock.min.js,更小的压缩版本,可以带来更快的速度体验。

  2. vue 使用 xe-ajax

    安装完成后自动挂载在vue实例this.$ajaxCDN安装使用script方式安装,VXEAjax会定义为全局变量生产环境请使用vxe-ajax.min.js,更小的压缩版本,可以带来更快的速度体验。cdnjs获取最新版本点击浏览已发布的所有npm包源码unpkg获取最新版本点击浏览已发布的所有npm包源码AMD安装require.js安装示例ES6Module安装通过Vue.use()来全局安装示例./Home.vue

  3. AJAX POST数据中文乱码解决

    前端使用encodeURI进行编码后台java.net.URLDecoder进行解码编解码工具

  4. Koa2框架利用CORS完成跨域ajax请求

    实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明。这样OPTIONS请求就能够通过了。至此为止,相当于仅仅完成了预检,还没发送真正的请求呢。

  5. form提交时,ajax上传文件并更新到&lt;input&gt;中的value字段

  6. ajax的cache作用

    filePath="+escape;},error:{alert;}});解决方案:1.加cache:false2.url加随机数正常代码:网上高人解读:cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓存里面读取而不是再到服务器端读取。

  7. 浅谈ajax上传文件属性contentType = false

    默认值为contentType="application/x-www-form-urlencoded".在默认情况下,内容编码类型满足大多数情况。在这里,我们主要谈谈contentType=false.在使用ajax上传文件时:在其中先封装了一个formData对象,然后使用post方法将文件传给服务器。说到这,我们发现在JQueryajax()方法中我们使contentType=false,这不是冲突了吗?这就是因为当我们在form标签中设置了enctype=“multipart/form-data”,

  8. 909422229_ajaxFileUpload上传文件

    ajaxFileUpload.js很多同名的,因为做出来一个很容易。我上github搜AjaxFileUpload出来很多类似js。ajaxFileUpload是一个异步上传文件的jQuery插件传一个不知道什么版本的上来,以后不用到处找了。语法:$.ajaxFileUploadoptions参数说明:1、url上传处理程序地址。2,fileElementId需要上传的文件域的ID,即的ID。3,secureuri是否启用安全提交,默认为false。4,dataType服务器返回的数据类型。6,error

  9. AJAX-Cache:一款好用的Ajax缓存插件

    原文链接AJAX-Cache是什么Ajax是前端开发必不可少的数据获取手段,在频繁的异步请求业务中,我们往往需要利用“缓存”提升界面响应速度,减少网络资源占用。AJAX-Cache是一款jQuery缓存插件,可以为$.ajax()方法扩展缓存功能。

  10. jsf – Ajax update/render在已渲染属性的组件上不起作用

    我试图ajax更新一个有条件渲染的组件。我可以确保#{user}实际上是可用的。这是怎么引起的,我该如何解决呢?必须始终在ajax可以重新呈现之前呈现组件。Ajax正在使用JavaScriptdocument.getElementById()来查找需要更新的组件。但是如果JSF没有将组件放在第一位,那么JavaScript找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

返回
顶部