<%@ 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