刘斌ID:liu_binq63
1118次访问,排名2万外好友1人,关注者1
不想说
liu_binq63的文章
原创 17 篇
翻译 0 篇
转载 1 篇
评论 0 篇
liu_binq63的公告
最近评论
文章分类
收藏
相册
喇叭花日记
存档
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

原创 MSDN勘误-关于ICallbackEventHandler接口收藏

新一篇: 关于asp.net中服务器端的checkbox没有value属性的问题  | 旧一篇: 到底是用UTF-8还是GB2312



这两天在研究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的了解不够深入造成的,希望大家给与指正。

 

发表于 @ 2008年05月13日 11:38:03|评论(loading...)|编辑

新一篇: 关于asp.net中服务器端的checkbox没有value属性的问题  | 旧一篇: 到底是用UTF-8还是GB2312

评论:没有评论。

发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © liu_binq63