ArcGIS Server .Net ADF中的AJAX

來源:互聯網
上載者:User

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.