这两天在研究asp.net2.0的callback。在msdn中找到了这段示例代码:
ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_aspnetcon/html/14b85dbe-1c60-4f66-9c38-f22416fd72b4.htm
' ClientCallback.aspx page
<%@ Page Language="VB" AutoEventWireup="false"
CodeFile="ClientCallback.aspx.vb" Inherits="ClientCallback" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
<script type="text/javascript">
Function LookUpStock()function LookUpStock()
{
var lb = document.forms[0].ListBox1;
var product = lb.options[lb.selectedIndex].text
CallServer(product, "");
}

Function ReceiveServerData()function ReceiveServerData(rValue)
{
Results.innerText = rValue;
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ListBox ID="ListBox1" Runat="server"></asp:ListBox>
<br />
<br />
<button onclick="LookUpStock()">Look Up Stock</button>
<br />
<br />
Items in stock: <span ID="Results"></span>
<br />
</div>
</form>
</body>
</html>
' ClientCallback.aspx.vb code-behind file
Partial Class ClientCallbackClass ClientCallback
Inherits System.Web.UI.Page
Implements System.Web.UI.ICallbackEventHandler
Protected catalog As ListDictionary
Sub Page_Load()Sub Page_Load(ByVal sender As Object, ByVal e As _
System.EventArgs) Handles Me.Load
Dim cbReference As String
cbReference = Page.ClientScript.GetCallbackEventReference(Me, _
"arg", "ReceiveServerData", "context")
Dim callbackScript As String = ""
callbackScript &= "function CallServer(arg, context) { " & _
cbReference & "} ;"
Page.ClientScript.RegisterClientScriptBlock(Me.GetType(), _
"CallServer", callbackScript, True)
' Populate List Dictionary with invented database data
catalog = New ListDictionary()
catalog.Add("monitor", 12)
catalog.Add("laptop", 10)
catalog.Add("keyboard", 23)
catalog.Add("mouse", 17)
ListBox1.DataSource = catalog
ListBox1.DataTextField = "key"
ListBox1.DataBind()
End Sub

Public Function RaiseCallbackEvent()Function RaiseCallbackEvent(ByVal eventArgument _
As String) As String Implements _
System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent
Dim returnValue As String
If catalog(eventArgument) Is Nothing Then
returnValue = "-1"
Else
returnValue = catalog(eventArgument).ToString()
End If
Return returnValue
End Function
End Class复制到vs里面却提示错误,检查了一下,发现ICallbackEventHandler要求实现两个方法,一个是sub,另外一个是function:

Public Function GetCallbackResult()Function GetCallbackResult() As String Implements System.Web.UI.ICallbackEventHandler.GetCallbackResult
End Function

Public Sub RaiseCallbackEvent()Sub RaiseCallbackEvent(ByVal eventArgument As String) Implements System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent
End Sub这段示例代码给的是一个function,但是名字却是接口规定的那个sub的名称。根据名称,我判断,当callback的时候,首先执行RaiseCallbackEvent,直译为“发生CallBack事件”,然后再执行GetCallbackResult,直译为“得到CallBackResult”。于是我做了一个实验,首先定义了一个全局变量:
Private TestStr as String=""
然后把这两段代码修改一下:

Public Function GetCallbackResult()Function GetCallbackResult() As String Implements System.Web.UI.ICallbackEventHandler.GetCallbackResult
TestStr=TestStr & "GetCallbackResult"
End Function

Public Sub RaiseCallbackEvent()Sub RaiseCallbackEvent(ByVal eventArgument As String) Implements System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent
TestStr=TestStr & "RaiseCallbackEvent"
End Sub
然后在TestStr=TestStr & "RaiseCallbackEvent"处加上断点。执行到这一句是,检查TestStr的值,结果是空值,也就是说,发生Callback的时候,首先执行的是RaiseCallbackEvent,按F11调试,果然,执行完这个方法后才去执行GetCallbackResult。
于是我就对示例代码作了一些修改:
1、定义一个全局变量CBRE用来存储eventArgument的值:
Private CBRE As String
2、修改代码如下:

Public Function GetCallbackResult()Function GetCallbackResult() As String Implements System.Web.UI.ICallbackEventHandler.GetCallbackResult
Dim returnValue As String
If catalog(CBRE) Is Nothing Then
returnValue = "-1"
Else
returnValue = catalog(CBRE).ToString()
End If
Return returnValue
End Function

Public Sub RaiseCallbackEvent()Sub RaiseCallbackEvent(ByVal eventArgument As String) Implements System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent
CBRE = eventArgument
End Sub
这样修改后,这个Callback的示例就能正常工作了。
不知道我发现的这个问题是不是真的存在,还是因为我对.net的了解不够深入造成的,希望大家给与指正。
本文探讨了ASP.NET 2.0中的Callback功能,通过示例代码详细解释了ICallbackEventHandler接口的使用,并分享了作者在实践过程中的调试经验和代码修改心得。
110

被折叠的 条评论
为什么被折叠?



