none
偶需要帮助,麻烦推荐一本讲callback很透彻的一本书,最好有下载的。 RRS feed

  • 问题

  • 或者给偶一端callback的代码,能否给偶讲讲每一句每一个参数的用法,意义,对应的流程。

    真是麻烦了
    maiyude
    2009年8月9日 11:33

答案

  • 您好,callback的含义是:调用方函数调用被调用方函数,等被调用方函数执行完毕后,由被调用方回调调用方另一个函数。通常调用方和被调用方是在不同的线程上

    以下是对您贴出代码的解释,请参考:

       代码的执行顺序:客户端的DoSearch()--->客户端的CallServer(txtFirstName.value, "")--->服务器端的RaiseCallbackEvent(string txtFirstName)--->服务器端的string GetCallbackResult()--->回调客户端的ReceiveServerData(txtUserInfo) 把结果显示出来。

      一些理解的关键点:
    Page.ClientScript.GetCallbackEventReference会生成一段如下代码:
    WebForm_DoCallback('__Page',arg1,ReceiveServerData,context,null,false)}
    而Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "CallServer", callbackScript, true);则是在客户端注册CallServer脚本函数。
    所以两者加在一起形成下面的代码:(可以通过在网页上“查看源代码”确认)
    <script type="text/javascript">
    function CallServer(arg, context){ WebForm_DoCallback('__Page',arg,ReceiveServerData,context,null,false)} ;>
    </script>
    您提到的arg是客户端向服务器端传递的参数,在本例中是txtFirstName.value,这个参数会被WebForm_DoCallback传递到服务器端同时触发服务器端RaiseCallbackEvent(string txtFirstName)方法。本例中是查询输入的用户。
    等RaiseCallbackEvent方法执行完毕后,webform机制会调用 GetCallbackResult()方法,最后回调客户端方法ReceiveServerData(txtUserInfo),该方法是在GetCallbackEventReference中注册的。GetCallbackResult()的返回值会作为客户端ReceiveServerData(txtUserInfo)的参数传递,在这里传给txtUserInfo

    注:要实现该回调功能必须实现ICallbackEventHandler接口。webform的内部机制会判断执行接口的方法。
    关于您提到的两个方法,具体参数含义,请参考:
    http://msdn.microsoft.com/zh-cn/library/system.web.ui.clientscriptmanager.getcallbackeventreference.aspx
    http://msdn.microsoft.com/zh-cn/library/system.web.ui.clientscriptmanager.registerclientscriptblock.aspx
    2009年8月9日 12:49
    版主
  • 你好 这里有几篇文章你可以参考下

    Reference http://jackielin.cnblogs.com/archive/2005/11/27/callback.html
    http://blog.csdn.net/sony0732/archive/2008/11/23/3354585.aspx


    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    2009年8月10日 1:36
    版主
  • 您说的
      一些理解的关键点:
    Page.ClientScript.GetCallbackEventReference会生成一段如下代码:
    WebForm_DoCallback('__Page',arg1,ReceiveServerData,context,null,false)}


    里面的arg1是不是就是arg啊?context没有定义过,是不是随便起个名字就可以啊?null和false是啥意思?__Page是啥东西啊?谢谢啦。


    maiyude

    WebForm_DoCallback的arg不是随便定义的,是传递CallServer方法的arg。
    arg1是在这里错误的,这个是我在做验证的时候改的。
    我将GetCallbackEventReference的arg的改成arg1时会报错。说明CallServer的arg会传递给WebForm_DoCallback
    WebForm_DoCallback是系统产生的。
    我认为您现在理解整个过程更重要,之后需要学习一些js的知识点。
    现在陷入这些细节会遮蔽全局观,现在需要掌握的是客户端的变量如何传递给服务器,然后服务器处理的结果又是如何传递回客户端。
    随着基本功的积累,再回过头来揣摩。
    2009年8月10日 11:48
    版主

全部回复

  • protected void Page_Load(object sender, EventArgs e)
     {

    String cbReference = Page.ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context");
      String callbackScript;
      callbackScript = "function CallServer(arg, context)" + "{ " + cbReference + "} ;";
      Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "CallServer", callbackScript, true);

    }

    是client side的callback,最主要就是上面的getcallbackeventreference不懂,arg是干嘛的,在哪里可以应用或者引用对应的?同样context是在哪里引用?callbackscript的作用是啥呢?registerclientscriptblock在这里干嘛?每个参数啥意思?

    下面是aspx的内容
    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="ClientCallbacks.aspx.cs" Inherits="ClientCallbacks" %>

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

    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>未命名页面</title>
        <script type="text/JavaScript">
        function DoSearch()
        {
            var txtFirstName = document.getElementById("txtUserName");
            CallServer(txtFirstName.value, "");
        }
       
        function ReceiveServerData(txtUserInfo)
        {
            Results.innerText = txtUserInfo;
        }
       
        setInterval('DoSearch()',1000);
      </script>

    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            姓名:<input id="txtUserName" type="text" /><br />
                <span ID="Results" style="background-color: pink; width: 500px;"></span>
        </div>
        </form>
    </body>
    </html>

    下面是对应的cs
    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Data.SqlClient;

    public partial class ClientCallbacks : System.Web.UI.Page,ICallbackEventHandler
    {
     protected string txtUserInfo; 

     protected void Page_Load(object sender, EventArgs e)
     {
       String cbReference = Page.ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context");
      String callbackScript;
      callbackScript = "function CallServer(arg, context)" + "{ " + cbReference + "} ;";
      Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "CallServer", callbackScript, true);
     }


     public void RaiseCallbackEvent(string txtFirstName)
     {
      if (txtFirstName != null)
      {
       SqlConnection conn = new SqlConnection("data source=.;initial catalog=Northwind;user id=sa1;password=sa1");
       conn.Open();

       SqlCommand cmd = new SqlCommand("select EmployeeID,FirstName,City,Address from Employees where FirstName=@FirstName", conn);
       cmd.Parameters.Add("@FirstName", SqlDbType.NVarChar, 10).Value = txtFirstName;
       SqlDataReader dr = cmd.ExecuteReader();

       if (dr.Read())
       {
        txtUserInfo = "员工代号:" + dr["EmployeeID"] + "  ,";
        txtUserInfo += "姓名:" + dr["FirstName"] + "  ,";
        txtUserInfo += "居住城市:" + dr["City"] + "  ,";
        txtUserInfo += "地址:" + dr["Address"].ToString().Replace("\r\n","") + "  ,";
        txtUserInfo += "服务器查询时间:" + DateTime.Now.ToLongTimeString();
       }
       else
       {
        if (String.IsNullOrEmpty(txtFirstName))
        {
         txtUserInfo = "请输入姓名";
        }
        else
        {
         txtUserInfo = "查无此人!";
        }
       }

       cmd.Dispose();
       dr.Dispose();
       conn.Dispose();
      }
     }


     public string GetCallbackResult()
     {
      return txtUserInfo;  }
    }


    maiyude
    2009年8月9日 11:53
  • 您好,callback的含义是:调用方函数调用被调用方函数,等被调用方函数执行完毕后,由被调用方回调调用方另一个函数。通常调用方和被调用方是在不同的线程上

    以下是对您贴出代码的解释,请参考:

       代码的执行顺序:客户端的DoSearch()--->客户端的CallServer(txtFirstName.value, "")--->服务器端的RaiseCallbackEvent(string txtFirstName)--->服务器端的string GetCallbackResult()--->回调客户端的ReceiveServerData(txtUserInfo) 把结果显示出来。

      一些理解的关键点:
    Page.ClientScript.GetCallbackEventReference会生成一段如下代码:
    WebForm_DoCallback('__Page',arg1,ReceiveServerData,context,null,false)}
    而Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "CallServer", callbackScript, true);则是在客户端注册CallServer脚本函数。
    所以两者加在一起形成下面的代码:(可以通过在网页上“查看源代码”确认)
    <script type="text/javascript">
    function CallServer(arg, context){ WebForm_DoCallback('__Page',arg,ReceiveServerData,context,null,false)} ;>
    </script>
    您提到的arg是客户端向服务器端传递的参数,在本例中是txtFirstName.value,这个参数会被WebForm_DoCallback传递到服务器端同时触发服务器端RaiseCallbackEvent(string txtFirstName)方法。本例中是查询输入的用户。
    等RaiseCallbackEvent方法执行完毕后,webform机制会调用 GetCallbackResult()方法,最后回调客户端方法ReceiveServerData(txtUserInfo),该方法是在GetCallbackEventReference中注册的。GetCallbackResult()的返回值会作为客户端ReceiveServerData(txtUserInfo)的参数传递,在这里传给txtUserInfo

    注:要实现该回调功能必须实现ICallbackEventHandler接口。webform的内部机制会判断执行接口的方法。
    关于您提到的两个方法,具体参数含义,请参考:
    http://msdn.microsoft.com/zh-cn/library/system.web.ui.clientscriptmanager.getcallbackeventreference.aspx
    http://msdn.microsoft.com/zh-cn/library/system.web.ui.clientscriptmanager.registerclientscriptblock.aspx
    2009年8月9日 12:49
    版主
  • 谢谢楼上的大大,偶有问题。 这里面的context是啥意思? 里面的CallServer是啥函数,咋用啊? 谢谢
    maiyude
    2009年8月10日 1:02
  • 你好 这里有几篇文章你可以参考下

    Reference http://jackielin.cnblogs.com/archive/2005/11/27/callback.html
    http://blog.csdn.net/sony0732/archive/2008/11/23/3354585.aspx


    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    2009年8月10日 1:36
    版主
  • 谢谢楼上的大大,偶有问题。这里面的context是啥意思? 里面的CallServer是啥函数,咋用啊?谢谢
    maiyude
    您好,
    context的含义:启动回调之前在客户端计算的客户端脚本。脚本的结果传回客户端事件处理程序。在本例中没有客户端脚本。
    CallServer是注册的客户端脚本,用来触发服务器端代码的。
    更具体的请参考我贴出的msdn连接。上面有详尽的例子和说明。请动手跟着msdn测试,并比对我提供的访问流程,慢慢就有体会。别着急。
    2009年8月10日 5:03
    版主
  • 您说的
      一些理解的关键点:
    Page.ClientScript.GetCallbackEventReference会生成一段如下代码:
    WebForm_DoCallback('__Page',arg1,ReceiveServerData,context,null,false)}


    里面的arg1是不是就是arg啊?context没有定义过,是不是随便起个名字就可以啊?null和false是啥意思?__Page是啥东西啊?谢谢啦。


    maiyude
    2009年8月10日 11:11
  • 您说的
      一些理解的关键点:
    Page.ClientScript.GetCallbackEventReference会生成一段如下代码:
    WebForm_DoCallback('__Page',arg1,ReceiveServerData,context,null,false)}


    里面的arg1是不是就是arg啊?context没有定义过,是不是随便起个名字就可以啊?null和false是啥意思?__Page是啥东西啊?谢谢啦。


    maiyude

    WebForm_DoCallback的arg不是随便定义的,是传递CallServer方法的arg。
    arg1是在这里错误的,这个是我在做验证的时候改的。
    我将GetCallbackEventReference的arg的改成arg1时会报错。说明CallServer的arg会传递给WebForm_DoCallback
    WebForm_DoCallback是系统产生的。
    我认为您现在理解整个过程更重要,之后需要学习一些js的知识点。
    现在陷入这些细节会遮蔽全局观,现在需要掌握的是客户端的变量如何传递给服务器,然后服务器处理的结果又是如何传递回客户端。
    随着基本功的积累,再回过头来揣摩。
    2009年8月10日 11:48
    版主
  • 谢谢楼上的大大的讲解,。。。。
    maiyude
    2009年8月11日 11:53
  • 不客气,互相交流
    2009年8月12日 8:20
    版主