首先要继承System.Web.UI.ICallbackEventHandler接口
实现public void RaiseCallbackEvent(string eventArg)和 public string GetCallbackResult()方法
流程:
(1)客户端先通过<input type="button" value="测试无刷新客户端回调" onclick="CallServerFucntion()"/>的单击事件
调用客户端的CallServerFucntion()方法;
(2)CallServerFucntion()方法通过GetCallbackEventReference()方法引发回调,
(3)服务端通过RaiseCallbackEvent()来处理从客户端传来的数据。
(4)处理结果由GetCallbackResult()返回给客户端。
(5)客户端再通过客户端事件ReceiveServerData()来接收由服务端发送来的数据。
客户端代码:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
客户端代码
1![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
<%
@ Page Language="C#" AutoEventWireup="true" CodeBehind="ICallbackEventHandlerTest.aspx.cs" Inherits="WebTest.ICallbackEventHandlerTest" %>
2![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
4![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
5
<html xmlns="http://www.w3.org/1999/xhtml" >
6
<head runat="server">
7
<title>测试无刷新客户端回调</title>
8![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
<style type="text/css">![](https://www.cnblogs.com/Images/dot.gif)
9![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
#t1{
}{width: 409px;}
10
</style>
11![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
<script type="text/javascript">![](https://www.cnblogs.com/Images/dot.gif)
12![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
13
// 也可以在后台void Page_Load(object sender, EventArgs e)里注册该客户端方法脚本
14
// {
15
// ClientScriptManager cm = Page.ClientScript;
16
// String cbReference = cm.GetCallbackEventReference(this, "arg", "ReceiveServerData", null);
17
// String callbackScript = "function CallServerFucntion() { var arg='客户端数据'; " + cbReference + "; }";
18
// cm.RegisterStartupScript(this.GetType(),"CallServer", callbackScript, true);
19
// }
20
function CallServerFucntion()
21![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
22
var arg="客户端的数据";//传递到服务端可供RaiseCallbackEvent事件处理的数据
23
24
// ClientScript.GetCallbackEventReference获取一个对客户端函数的引用;
25
// 调用该函数时,将启动一个对服务器事件的客户端回调。
26
// this:处理客户端回调的服务器 Control。
27
// arg:从客户端脚本传递给服务器的一个参数 。
28
// ReceiveServerData:一个客户端事件处理程序的名称,该处理程序接收成功的服务器事件的结果。
29
// null:表启动回调之前在客户端计算的客户端脚本。脚本的结果传回客户端事件处理程序。
30
<%=ClientScript.GetCallbackEventReference(this,"arg","ReceiveServerData",null) %>
31
}
32
33
// ReceiveServerData可以接收、处理服务端传来的数据,serverData是服务端传来的数据。
34
function ReceiveServerData(serverData)
35![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
36
document.getElementById("t1").value=serverData;
37
}
38
</script>
39
</head>
40
<body>
41
<form id="form1" runat="server">
42
<div>
43
<input type="text" id="t1"/>
44
<input type="button" value="测试无刷新客户端回调" onclick="CallServerFucntion()"/>
45
</div>
46
</form>
47
</body>
48
</html>
49![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
50![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
服务端代码:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
服务端代码
1
using System;
2
using System.Web;
3![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
4
namespace WebTest
5![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
6
public partial class ICallbackEventHandlerTest :System.Web.UI.Page,System.Web.UI.ICallbackEventHandler
7![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
8
protected string result =string.Empty;
9![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
10
protected void Page_Load(object sender, EventArgs e)
11![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
12
// 当客户端没有写引发回调函数的时候(function CallServerFucntion()方法),可以通过此方法向客户端注入脚本。
13
// ClientScriptManager cm = Page.ClientScript;
14
// String cbReference = cm.GetCallbackEventReference(this, "arg", "ReceiveServerData", null);
15
// String callbackScript = "function CallServerFucntion() { var arg='客户端数据'; " + cbReference + "; }";
16
// cm.RegisterClientScriptBlock(this.GetType(),"CallServer", callbackScript, true);
17
}
18![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
19![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
20
/// MSDN的解释:处理以控件为目标的回调事件。
21
/// 我的理解:客户端引发该事件,处理完后,数据可以通过GetCallbackResult()返回给客户端
22
/// 这里,通过客户端函数 function ReceiveServerData(serverData) 来接收 result
23
/// </summary>
24
/// <param name="eventArg">从客户端接收的数据</param>
25
public void RaiseCallbackEvent(string eventArg)
26![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
27
string clientData = eventArg;
28![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
29
result = clientData+ "---服务端处理的数据结果";
30
}
31![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
32![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
33
/// MSDN的解释:返回以控件为目标的回调事件的结果
34
/// </summary>
35
/// <returns></returns>
36
public string GetCallbackResult()
37![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
38
return result;
39
}
40
}
41
}
42![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)