ICallbackEventHandler学习笔记一(转载)

<%@ Page Language="C#" %>
<%@ Implements Interface="System.Web.UI.ICallbackEventHandler" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
    int cbCount = 0;
    public void RaiseCallbackEvent(String eventArgument)
    {
        cbCount = Convert.ToInt32(eventArgument) + 1;
    }

   
    public string GetCallbackResult()
    {
        return cbCount.ToString();
    }

    protected void Page_Load(object sender, EventArgs e)
    {
       
        StringBuilder sb = new StringBuilder();
        sb.Append("No page postbacks have occurred.");
        if (Page.IsPostBack)
        {
            sb.Append("A page postback has occurred.");
        }
       
        MyLabel.Text = sb.ToString();
        ClientScriptManager cs = Page.ClientScript;
        String cbReference1 = cs.GetCallbackEventReference(this, "arg", "ReceiveServerData1", "");
        String callbackScript1 = "function CallTheServer1(arg, context) {" + cbReference1 + "; }";
        cs.RegisterClientScriptBlock(this.GetType(), "CallTheServer1", callbackScript1, true);

    }
</script>

<html >
<head id="Head1" runat="server">
    <title>ClientScriptManager Example</title>
</head>
<body>
    <form id="Form1"
          runat="server">
    <div>
      Callback 1 result: <span id="Message1">0</span>
     
      <br />
     
      <asp:Label id="MyLabel" runat="server"></asp:Label>
    </div>
    <script language ="javascript" type ="text/javascript" >
       var a=-1;
       function getmsg()
       {
          a++;
          CallTheServer1(a,'');
       }
      
       setInterval('getmsg()',1000);
       

        function ReceiveServerData1(args, context)
        {
               Message1.innerText = args;
        }


       //setTimeout("getmsg()",1000);
       //getmsg();
    </script>
    </form>
</body>
</html>

在vs2005 下调试,点击 "debug" , 页面如图:



然后callback 1 result: 后面的数字不断递增。

这是怎么来的? 首先在页面加载的时候,运行 Page_Load(object sender, EventArgs e),在页面中注册一个函数,说的更形象点,就相当于我们写一个javascript 函数,函数是这样的,

<script language ="javascript" type ="text/javascript" >
        function CallTheServer1(arg, context)
        {
            args=RaiseCallbackEvent(arg)        ...  
//对arg 的操作
            .....content.....                                       //对content的操作,这里content为空,不操作
            ReceiveServerData1(args, context)

        }
         </script>
当然,真实的情况不是这样的,我这样写,只是为了便于理解。然后运行 setInterval('getmsg()',1000);
,每隔一秒运行 getmsg() 函数,getmsg() 正好调用 上面的 CallTheServer1(arg, context) 函数,而这里是CallTheServer1(a,'');相当于 arg 是 a, content 为空。 接着看CallTheServer1的函数体,是先运行

RaiseCallbackEvent(arg),即 args=RaiseCallbackEvent(a)=a+1, 然后 把 args通过 GetCallbackResult()
函数传给ReceiveServerData1(args, context),所以 Message1.innerText = args=a+1,
所以你看到的结果是:


然后数字继续上涨。

GetCallbackEventReference(),有四个参数,

第一个是实现了ICallbackEventHandler接口的页面或者服务器控件,写this代表但前页面。

第二个参数是要从客户端传递给服务器RaiseCallbackEvent方法的值。

第三个参数是 GetCallbackResult() 函数 把返回值 要传给的 函数 的函数名。简单的说,这是个函数的名字,这个函数 的参数来自 GetCallbackResult() 的 返回值。这懂了吧,不懂把例子多看几遍。

第四个参数 是,如果你不想在 <script language ="javascript" type ="text/javascript" >......</script>里面写第三个参数(也就是这里的ReceiveServerData1) 的函数体,这里就给了你机会,你可以动态的写了,具体如下:

StringBuilder context1 = new StringBuilder();
        context1.Append("function ReceiveServerData1(arg, context)");
        context1.Append("{");
        context1.Append("Message1.innerText = arg;");
        context1.Append("}");

        String cbReference1 = cs.GetCallbackEventReference(this, "arg", "ReceiveServerData1", context1.ToString() );   //这里改了哦。
//另外还要注消掉 ReceiveServerData1 函数啊,因为你这里动态的生成了。

转自:http://hi.baidu.com/csharp_ajax/blog/item/1e34e4d9d9b7063f33fa1cb0.html/cmtid/3291d3dcb7eeafd58d10290b
http://www.cnblogs.com/mouse_in_beijing/archive/2010/02/24/1672302.html

原文地址:https://www.cnblogs.com/johnwonder/p/1680732.html