积极答复者
偶需要帮助,麻烦推荐一本讲callback很透彻的一本书,最好有下载的。

问题
答案
-
您好,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- 已编辑 JiyuanModerator 2009年8月9日 13:40
- 已标记为答案 KeFang Chen 2009年8月11日 2:10
-
你好 这里有几篇文章你可以参考下
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- 已标记为答案 KeFang Chen 2009年8月11日 2:10
-
您说的
一些理解的关键点:
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的知识点。
现在陷入这些细节会遮蔽全局观,现在需要掌握的是客户端的变量如何传递给服务器,然后服务器处理的结果又是如何传递回客户端。
随着基本功的积累,再回过头来揣摩。- 已标记为答案 KeFang Chen 2009年8月11日 2:10
全部回复
-
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 -
您好,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- 已编辑 JiyuanModerator 2009年8月9日 13:40
- 已标记为答案 KeFang Chen 2009年8月11日 2:10
-
你好 这里有几篇文章你可以参考下
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- 已标记为答案 KeFang Chen 2009年8月11日 2:10
-
您说的
一些理解的关键点:
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的知识点。
现在陷入这些细节会遮蔽全局观,现在需要掌握的是客户端的变量如何传递给服务器,然后服务器处理的结果又是如何传递回客户端。
随着基本功的积累,再回过头来揣摩。- 已标记为答案 KeFang Chen 2009年8月11日 2:10