建置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協助。
沒有留言:
張貼留言