MSDN勘误-关于ICallbackEventHandler接口

<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>


这两天在研究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()
    {
        var lb 
= document.forms[0].ListBox1;
        var product 
= lb.options[lb.selectedIndex].text 
        CallServer(product, 
"");
    }

    
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 ClientCallback
    
Inherits System.Web.UI.Page
    
Implements System.Web.UI.ICallbackEventHandler

    
Protected catalog As ListDictionary
    
Sub Page_Load(ByVal sender As ObjectByVal 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(ByVal eventArgument _
        
As StringAs 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() As String Implements System.Web.UI.ICallbackEventHandler.GetCallbackResult

    
End Function


    
Public   Sub RaiseCallbackEvent(ByVal eventArgument As StringImplements System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent

    
End Sub

这段示例代码给的是一个function,但是名字却是接口规定的那个sub的名称。根据名称,我判断,当callback的时候,首先执行RaiseCallbackEvent,直译为“发生CallBack事件”,然后再执行GetCallbackResult,直译为“得到CallBackResult”。于是我做了一个实验,首先定义了一个全局变量:
Private TestStr as String=""

然后把这两段代码修改一下:

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


    
Public   Sub RaiseCallbackEvent(ByVal eventArgument As StringImplements 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() 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(ByVal eventArgument As StringImplements 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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值