这两天在研究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
< %@ 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:
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=""
然后把这两段代码修改一下:
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、修改代码如下:
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的了解不够深入造成的,希望大家给与指正。
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>