zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    查看mysql版本的四种方法及常用命令
    newInstance和new的区别(good)
    Citrix 服务器虚拟化之六 Xenserver虚拟机创建与快照
    Java实现 蓝桥杯 算法训练 排序
    Java实现 蓝桥杯 算法训练 排序
    Java实现 蓝桥杯 算法训练 排序
    Java实现 蓝桥杯 算法训练 2的次幂表示
    Java实现 蓝桥杯 算法训练 2的次幂表示
    Java实现 蓝桥杯 算法训练 前缀表达式
    Java实现 蓝桥杯 算法训练 前缀表达式
  • 原文地址:https://www.cnblogs.com/johnwonder/p/1680732.html
Copyright © 2011-2022 走看看