• 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

  • 相关阅读:
    redis网络资料汇总
    Spring攻略学习笔记(3.01)在Spring中启用AspectJ注解支持
    [C/C++]福尔摩斯 ABCDE*?=EDCBA
    MyBatis测试范例
    使用TileMap制作游戏地图,在cocos2dx中使用(一)
    Tomcat7 catalina.out 日志分割
    MyBatis之User.xml
    基于 SIP webRTC 架构的系统部署模型分析
    第42周星期二
    第41周星期三小结
  • 原文地址:https://www.cnblogs.com/johnwonder/p/1680732.html
Copyright © 2020-2023  润新知