2010年4月9日 星期五

ASP.NET 的 CallBack

.Net 2.0 增新 CallBack功能,看書上說是 AJAX 模式,可以不用整首刷新,可是實際測試結果,它還是整頁刷新,並沒有 AJAX 功能。
我的測試方式如下:(只有一頁 Default.aspx)

一、在置程式碼手動加入(紅字部分)

Partial Class _Default
Inherits System.Web.UI.Page
Implements System.Web.UI.ICallbackEventHandler
Protected retValue As String

Public Function GetCallbackResult() As String Implements System.Web.UI.ICallbackEventHandler.GetCallbackResult
Dim pp As String = retValue
retValue = ""
Return pp

End Function

Public Sub RaiseCallbackEvent(ByVal eventArgument As String) Implements System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent
retValue = retValue & eventArgument

End Sub

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
'If Not (IsCallback OrElse IsPostBack) Then
retValue = "PageLoad"
Dim cbRef As String
cbRef = Page.ClientScript.GetCallbackEventReference(Me, "arg", "ReceiveServerData", "context")
Dim callBackScript As String = ""
callBackScript += "function CallServer1(arg, context) {" & cbRef & "};" & vbCrLf
callBackScript += "function CallServer2(arg, context) {" & cbRef & "};" & vbCrLf
callBackScript += "function CallServer3(arg, context) {" & cbRef & "};" & vbCrLf

Page.ClientScript.RegisterClientScriptBlock(Me.GetType(), "CallServer", callBackScript, True)
' End If
End Sub
End Class

二、在Default.aspx 內拉三個 Button,並分別設定 onClientClick=onButton?() (? = 1, 2, 3)
三、在Default.asxp 內手動加入 JavaScript 如下:


測試結果:
1. 第一次開啟網頁時,按任何一個按鍵皆可秀 alert

2.如果將 Page_Load 中加入判斷 IsCallBack Orelse IsPostBack ,則再按Button 皆出現錯誤! 表示 CallBack之後,照樣會執行 Page_Load!

3.查看IE畫面,確實每按一Button,畫面皆會跳動一次!

是不是我做錯步驟? 為何跟書上說的不一樣?




原來 ASP.NET 的 Server 控制項原本就會引發 __doPostBack
input name="Button3" value="Button3" onclick="onButton('3');__doPostBack('Button3','')" id="Button3"

只要在 Load_Page 中再加入
Button3.Atrributes.Add("onclick","return true;") 就可以避掉 __doPostBack

可是引發 RaiseCallbackEvent 時,照樣會執行到 Load_Page ,所 return true 只決解部分問題,但仍無法達成 AJAX 的目標!

沒有留言:

張貼留言