我希望各位看官在看這篇文章之前,先對.NET中內建的Ajax瞭解較透,如果還不是很明白,建議先看我的上一篇博文.NET內建的Ajax工作原理
ESRI ArcGIS Server 9.2 的web應用開發架構充分利用了ASP.NET中的回調技術。我們來看看利用Visual Studio 模板建立的預設應用程式中如何利用回調的。
首先看到預設的首頁面Default.aspx 對應的類 WebMapApplication 實現了 ICallbackEventHandler 介面。 我們再以Identify工具來深入瞭解應用開發架構。 在 WebMapApplication 類的 Load 事件處理器中,調用 new MapIdentify(Map1) 初始化Identify 工具。在 MapIdentify 類的建構函式中,調用了SetupIdentify 方法。該方法首先通過調用 GetCallbackEventReference 方法來產生用戶端指令碼,然後調用 RegisterClientScriptBlock 註冊一個名為 identifyCallbackFunctionString 的 JavaScript 函數,該函數中調用產生的用戶端指令碼。 在 display_mapidentify.js 檔案的 MapIdClick 函數(Identify 事件處理器)中調用了 identifyCallbackFunctionString 函數,從而觸發了 WebMapApplication 類的 RaiseCallbackEvent 方法。 RaiseCallbackEvent 方法不僅需要處理 Identify 工具,還需要處理其他工具,本執行個體中包括關閉應用程式與擷取著作權文本。為了在該方法中判斷是哪個工具啟動了該方法調用,需要在傳入在參數中包含表明調用“身份”。同時由於在傳入參數中還需要其他可能更多的資訊,例如Identify工具,不僅需要表明調用者身份的資訊,還需要目前使用者單擊處 X、Y 座標資訊。為了能在RaiseCallbackEvent 方法中把這些資訊都解釋出來,本執行個體使用的是 "參數名1=參數值1&參數名2=參數值2"式。例如在 MapIdClick 函數中傳入的是 "ControlID=Map1&ControlType=Map&EventArg=MapIdentify&Map1_mode=MapIdentify&minx="+zleft+"&miny="+ztop而在 RaiseCallbackEvent 方法(或者是 RaiseCallbackEvent 中調用的 一個webservice方法,一個自訂類方法),通過調用 Split("&".ToCharArray ()) 方法將各個 “參數名=參數值” 放置到一組數組中,然後再通過建立雜湊表的方式把“參數名” 與 “參數值” 分開,具體的代碼如下: string[] keyValuePairs;//含有”=“的數組
string[] keyValue;//只有字串的數組
NameValueCollection m_queryString = new NameValueCollection ();//索引值對的集合
keyValuePairs = eventArgument.Split("&".ToCharArray ());//eventArgument是用戶端傳入的參數
if (keyValuePairs.Length > 0)//如果傳遞的參數是argA=arg1&argB=arg2……形式的,也就是說參數不止一個
{
for (int i = 0; i < keyValuePairs.Length; i++)
{
keyValue = keyValuePairs.GetValue(i).ToString().Split("=".ToCharArray());
m_queryString .Add(keyValue[0], keyValue[1]);
}
}
else//傳遞的參數只有一個
{
keyValue = eventArgument.Split("=".ToCharArray());
if (keyValue.Length > 0)//如果有參數傳遞過來的話
{
m_queryString .Add(keyValue[0], keyValue[1]);
}
}
//通過htQueryString["EventArg"]這種方式調用參數的值
return "您選擇的工具名稱是: " + m_queryString ["EventArg"].ToString() ; 通過執行上訴的代碼後,只需要調用m_queryString ["EventArg"]就能判斷是哪個工具啟動該方法的調用。如果是 Identify 工具,那麼該值就為 MapIdentify 。 在判斷出調用工具是 Identify 後, RaiseCallbackEvent 方法調用 MapIdentify 類的 Identify 方法得到傳回值。
通過解析 Arcserver ADF 中的 Ajax ,就不難理解為什麼利用 ArcServer ADF 開發的 webgis 產品中地圖的重新整理是如此之快了。。。。。。。。。。。。。