在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事件撰写如下程式码
'UpdatePanel中的按钮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
Implements System.Web.UI.ICallbackEventHandler 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
<script type= "text/javascript" > 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就是个不错的选择。

浙公网安备 33010602011771号