2006年出產的功能, 在2009年來看, 似乎舊了點, 人家都在談 ScriptManager + UpdatePanel 了, 使用關鍵字查詢(asp.net+callback)可以找到一些資料。

筆者碎碎念...
從開始接觸asp.net時就對postback很不滿意, 畫面閃半天事情也沒處理幾個, 所以一直沒有考慮使用。
在2008年10月因為工作上需要, 只好....努力跟它變成好朋友/___\

在ASP的時代都是由JavaScript代理處理例如縣市鄉鎮的選擇、多重選項的選取之類的小事
但是在ASP.NET不斷的PostBack中, 心中星星之火燎原了(/=_=)/ ┴──┴

在尋求[一個頁面一次PostBack處理完畢]的解決方案中,
重新思考撰寫程式的目的, 在所有畫面處理的過程中, 剩下來的只有使用者輸入的資料是我要的, 其他都不重要了

在不斷的嘗試下, 找到了ASP.NET的CallBack, 真是讓人眼晴為之一亮=__=+
我不用另外寫一個webserver了, 相關程式碼可以跟著頁面存在
雖然它只有一進一出的介面, 但是只要使用標籤式資料(勉強稱為XML)就可以解決了

從此我的ASP.NET只有單純HTML而己

回到2009年3月3日......

對於ASP.NET CallBack的介紹, 可以參考以下幾篇文章
http://www.dotblogs.com.tw/mis2000lab/archive/2008/09/23/postback_callback.aspx
http://blog.sina.com.tw/ajax/article.php?pbgid=11864&entryid=8960
http://diary.tw/tim/23
http://www.dotblogs.com.tw/jeff377/archive/2008/03/17/1754.aspx
http://blog.blueshop.com.tw/swtnwr/archive/2007/05/29/51062.aspx

簡單的說, 如果要使用CallBack就要
實作 System.Web.UI.ICallbackEventHandler 介面裡的二個方法
輸出函數:
Public Function GetCallbackResult() As String Implements System.Web.UI.ICallbackEventHandler.GetCallbackResult

輸入函數:
Public Sub RaiseCallbackEvent(ByVal eventArgument As String) Implements System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent

再加上一個自製函數需要在page_load時執行
Sub JSINC_FUN() 
 Dim cbReference As String = Page.ClientScript.GetCallbackEventReference(Me, "arg", "funBack", "context") 
 Dim callbackScript As String = "function funCall(arg, context, funBack) { " & cbReference & "} ;" 
 Page.ClientScript.RegisterClientScriptBlock(Me.GetType(), "funCall", callbackScript, True)
End Sub



程式碼範例:http://aqr198.googlepages.com/CallBack.rar

執行以上範例後, 檢視aspx在瀏覽器上的原始檔會發現以下幾個東西
1. 自動載入一個資源檔(WebResource.axd)
2. 自製的函數(JSINC_FUN)寫入了一個(funCall)內包含了(WebForm_DoCallback)
3. 在頁面下方多了一個初始化函數(WebForm_InitCallback)

資源檔(WebResource.axd)內容是一個js檔, 可以做為研究CallBack的實際運作。
初始化函數(WebForm_InitCallback)就沒什麼好說明了, 看看就好

關於WebForm_DoCallback, 當我們對應到html原始碼內容, 我們只有使用到三個參數而己。
function funCall(arg, context, funBack) {
 WebForm_DoCallback('__Page',arg,funBack,context,null,false);
}


可以在 WebResource.axd 內 找到WebForm_DoCallback程式內容, 發現它實際上有5個參數, 參數說明如下:

WebForm_DoCallback(
    eventTarget:引發動作的對象, 目前看到的是__Page, 如果我們在使用者自訂控制項內撰寫時, 它會對應到控制項名稱。
    eventArgument:傳入的內容
    eventCallback:執行完成後, 回傳的函數
    context:未知的項目
    errorCallback:錯誤處理函數
    useAsync:是否同步化, true:非同步執行, false:同步執行
)

如果想把funCall擴充為五個參數時, 可以透過 Page.ClientScript.GetCallbackEventReference 來達成, 它是一個多形的函數。
自訂函數(JSINC_FUN)必須修改如下:
Sub JSINC_FUN()

    Dim cbReference As String = Page.ClientScript.GetCallbackEventReference(Me, "arg", "funBack", "context", "errBack", False)

    Dim callbackScript As String = "function funCall(arg, context, funBack, errBack) { " & cbReference & "} ;"

    Page.ClientScript.RegisterClientScriptBlock(Me.GetType(), "funCall", callbackScript, True)

End Sub

接下來談談未知的項目(context), 它可以是一個變數, 也可以是一個物件。
目前可以想像它的作用就是區分呼叫者, 相同的呼叫, 可是來自不同的對象。

變數的用法如下
funCall("HMN", "IS_A_CALL_ME", fn);
funCall("HMN", "IS_B_CALL_ME", fn);
funCall("HMN", "IS_C_CALL_ME", fn);

function fn(v, context){
 alert(context+',v='+v);
}


物件的用法如下, 只說明了你可以代入更多的變數而己 ^^~
funCall("HMN", {name:'IS_A',action:'UPDATE'}, fn);
funCall("HMN", {name:'IS_B',action:'UPDATE_STATE'}, fn);
funCall("HMN", {name:'IS_C',action:'UPDATE_BACK'}, fn);

function fn(v, context){
 alert('name='+context.name+'action='+context.action+',v='+v);
}

以上~~希望對你有幫助^^

arrow
arrow
    全站熱搜

    aqr199xx 發表在 痞客邦 留言(0) 人氣()