於ArcGIS Server實作ICallbackEventHandler

這幾天多虧同事跑駐點服務,期初報告也在長官協助下順利提送,即使這禮拜靠杯次數有夠多,不過加班死拼總算擠出點像樣東西。

建置GIS雛形系統時,piggy習慣上會先作定位功能,本想沿襲piggy今年結案的一人GIS系統(哭哭....每次都一人),剛好最近和ola兄討論jQuery,便衍生出避免PostBack機制來精進定位功能的想法。趁此機會,把一直沒有仔細釐清的callback results給KO唄。


[範例情境]
1.以定位為例實作callback機制,達成不刷新地圖即可定位(互動)的目標
2.暫不涉獵父子視窗傳值,本例皆在同一頁面運作

透過詳細步驟學習ICallbackEventHandler之實作,而下列步驟並無強制規定step by step,請依個人開發習慣調整。


SETP 1:配置地圖定位之頁面layout
﹡中央配置大小適宜的Map(ArcGIS Web Control),請注意Map控件直接放在本頁aspx,無須使用iFrame的偷吃步方式來偽裝沒有PostBack
﹡MapResourceManager含二個圖層—graphLyr與swg,前者為GraphicsLayer,後者為你的MapService
﹡TextBox1用來key in圖層名稱
﹡TextBox2用來key in物件OBJECTID
﹡按下定位Button,地圖要能在本頁aspx不刷新的情況下定位
﹡TextBox1、TextBox2與定位按鈕都是html控件,並非ASPX控件

PS:本例暫不考慮圖層名稱不存在等例外,請自行依據需求作防呆或改用下拉式選單等


SETP 2:撰寫前端事件
按下按鈕後,要能蒐集TextBox1之圖層名稱以及TextBox2之OBJECTID,並將其組成字串,以便傳遞予後端處理。
也就是說按下html的input button後,要有個javascript function完成組字串&傳值的動作。
< input onclick="ZoomToFeatureClient();" type="button" value="定位" />

< script language="javascript" type="text/javascript">

function ZoomToFeatureClient()
{
  //使用jQuery獲取TextBox1&TextBox2的值
  var lyr = $("#TextBox1").val();
  var objId = $("#TextBox2").val();
  var context = 'Map1';
  //組字串
  var message = 'EventArg=ZoomToFeature&Layer=' + lyr + '&Id=' + objId;
  < %=ADFCallbackFunctionString%>

< /script>


SETP 3:撰寫後端事件
﹡定義待會用到的
private string m_ADFCallbackFunctionString;
private string m_CallbackResults;
protected void Page_Load(object sender, EventArgs e)
{
m_ADFCallbackFunctionString = Page.ClientScript.GetCallbackEventReference(this, "message", "ESRI.ADF.System.processCallbackResult", "context");
}

public string ADFCallbackFunctionString
{
    get { return m_ADFCallbackFunctionString; }
    set { m_ADFCallbackFunctionString = value; }
}
  
  
m_ADFCallbackFunctionString是用來註冊function
m_CallbackResults則是傳值

﹡繼承System .Web.UI.ICallbackEventHandler
VS會自動為您產生ICallbackEventHandler成員region,裡面包含GetCallbackResult()與RaiseCallbackEvent(string eventArgument)。請分別依據需求撰寫這2個函示。
# region ICallbackEventHandler 成員
//處理要回傳給 Client端(瀏覽器) 的值
public string GetCallbackResult()
{
    return m_CallbackResults;
}

//取得Client傳給Server端的值
public void RaiseCallbackEvent(string eventArgument)
{
    try
   {
       System.Collections.Specialized.NameValueCollection nameValueCollection =
       ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackUtility.ParseStringIntoNameValueCollection
       (eventArgument);
      
      if (nameValueCollection["EventArg"] == "ZoomToFeature")
     {
         //ZoomToFeatureServer是自己寫在後端的定位方法
           ZoomToFeatureServer(nameValueCollection["Layer"], "OBJECTID", nameValueCollection["Id"]);
      }
      else if (nameValueCollection["EventArg"] == "其他case")
      {略....}
   }
   catch
   {
        m_CallbackResults = Map1.CallbackResults.ToString();
   }
}

# endregion
private void ZoomToFeatureServer(string m_queryLayerName, string m_queryFieldName, string value) { 略... m_CallbackResults = Map1.CallbackResults.ToString(); }



SETP 4:執行




PS:ArcGIS Server9.3有二種方式實現非同步效果,Callback與PartialPostback,前者即為本文探討範圍,後者則透過ScriptManager協助。

沒有留言: