日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

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

發布時間:2023/12/10 asp.net 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Esri中国社区 » GIS大讲堂:ArcGIS Server .Net ADF中的AJAX 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。