在ASP.NET 2.0预设实现AJAX有二种方式,一种是CallBack机制,另一种是ASP.NET AJAX的UpdatePanel。 如果就开发使用的便利性而言,无可争议的一定是使用UpdatePanel,因为它可以让AJAX实现的不着痕迹;而使用CallBack机制必需实作System.Web.UI.ICallbackEventHandler介面,并处理CallBack用户端与伺服端进行资料交换的所有细节。 这代表CallBack机制一无可取吗? 或者它只是个过时的产物吗?
以下做个「取得伺服端时间」的简单范例做比较,分别以CallBack及UpdatePanel来实现AJAX的效果。
我们在页面上放置二个按钮,一个「CallBack Click」的按钮是置于页面上,另一个「UpdatePanel Click」的按钮则置于UpdatePanel中,另外在页面下方(UpdatePanel之外)放置一个无关的GridView来呈现资料。
使用UpdatePanel取得伺服端时间,在「UpdatePanel Click」的Click事件撰写如下程式码
2 Protected Sub btnUpdatePanelButton_Click( ByVal sender As Object, ByVal e As System.EventArgs)
3 Label1.Text = Now.ToString() '伺服端时间
4 End Sub
使用CallBack取得伺服端时间就比较麻烦了点,需要实作System.Web.UI.ICallbackEventHandler介面的GetCallbackResult及RaiseCallbackEvent,并撰写用户端的JavaScript处理CallBack的回传结果。
*.aspx.vb
0 2
0 3 ''' <summary>
0 4 '''传回CallBack的传回结果。
0 5 ''' </summary>
0 6 Public Function GetCallbackResult() As String Implements System.Web.UI.ICallbackEventHandler.GetCallbackResult
0 7 Return Now.ToString() '传回伺服端时间
0 8 End Function
0 9
10 ''' <summary>
11 '''处理CallBack的传入引数。
12 ''' </summary>
13 ''' <param name="eventArgument"> CallBack前端传入引数。 </param>
14 Public Sub RaiseCallbackEvent( ByVal eventArgument As String ) Implements System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent
15 End Sub
16
17 Protected Sub Page_Load( ByVal sender As Object, ByVal e As System.EventArgs) Handles Me .Load
18 'Button1的onclick执行CallBack回伺服端
19 btnCallBackButton.Attributes( "onclick" ) = Me .ClientScript.GetCallbackEventReference( Me , "", "ReceiveServerData ", " ")
20 End Sub
*.aspx
2 function ReceiveServerData(rValue)
3 {
4 var o = document.getElementById( "Label1" );
5 o.innerText = rValue;
6 }
7 </script>
执行程式,并使用Fidder来查看程式执行过程。 首先执行「UpdatePanel Click」按钮来取得伺服端时间,接着执行「CallBack Click」按钮来取得伺服端时间。
在Fidder中可以明显的发现同样取得伺服端时间的功能,使用UpdatePanel回传的Size高达21255 Bytes,而CallBack却只有693 Bytes,有没有很惊讶,同样的功能回传的Size竟差异30倍左右。
接下来把GridView拖曳至UpdatePanel中再执行一次程式。
执行程式,同样使用Filder查看结果。
当GridView放置UpdatePanel中时,使用UpdatePanel回传的Size高达44313 Bytes,而CallBack还是只有693 Bytes。
会有以上的结果是必然的,因为UpdatePanel无法预知要更新那些部分,只要是在UpdatePanel中的控制项,它需要在执行AJAX非同步更新时维护所有子控制项的状态,所以需传递更多的资讯。 如果没有传输量的问题,UpdatePanel无疑是实现AJAX的完美机制;但在页面部分需要好的执行效能时,CallBack就是个不错的选择。