由于也是初学者,还不知道它和当前ajax之间有什么联系,个人感觉用这种方法就可以实现异步刷新页面了,那为什么还要用到ajax技术了呢?难道客户端回调只属于.net下面特有的,而ajax是无平台区分的么?
下面是我对.net中回调一些理解,难免有些肤浅,希望大家指正。
1.首先要对页面实现ICallbackEventHandler 接口,这主要是让控件可以作为服务器回调事件的目标
一般做法是让页面继承该接口:public partial class calltest :System.Web.UI.Page, System.Web.UI.ICallbackEventHandler { 后台代码 }
2.实现RaiseCallbackEvent和GetCallbackResult方法,其中RaiseCallbackEvent(个人理解:回调函数会自动执行这个事件)用来处理客户端传递过来的变量,GetCallbackResult主要是返回回调的结果。
3.定义一个管理客户端脚本对象ClientScriptManager,这个对象在后面用得上。
4.根据第三步对象,使用它的方法GetCallbackEventReference(),该方法是获取一个对客户端函数的引用;调用该函数时,将启动一个对服务器端事件的客户端回调。 这个方法里有几个参数,其中常见的:
-
control
-
处理客户端回调的服务器 Control。该控件必须实现 ICallbackEventHandler 接口并提供 RaiseCallbackEvent 方法。
-
argument
-
从客户端脚本传递给服务器端的一个参数
RaiseCallbackEvent 方法。
-
clientCallback
-
一个客户端事件处理程序的名称,该处理程序接收成功的服务器端事件的结果。
-
context
-
启动回调之前在客户端计算的客户端脚本。脚本的结果传回客户端事件处理程序。
5.让后将上面脚本注册到客户端,当客户端响应到注册脚本时,则会调用回调函数,回调函数可以响应操作并返回一些值,这样就可以和客户端进行交互,实现无刷新。
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="call.aspx.cs" Inherits="calltest" %>
<!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 id="Head2" runat="server">
<title>ClientScriptManager Example</title>
<script type="text/javascript">
function ProcessCallBackError(arg, context)
{
Message2.innerText = 'An error has occurred.';
}
</script>
</head>
<body>
<form id="Form1"
runat="server">
<div>
<input type="button"
value="ClientCallBack2"
οnclick="CallTheServer2(value2,'')"/>
<br /> <br />
<asp:Label id="MyLabel"
runat="server"></asp:Label>
<div id="test"></div>
</div>
</form>
</body>
</html>
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.Net;
using System.Text;
public partial class calltest :System.Web.UI.Page, System.Web.UI.ICallbackEventHandler {
public ArrayList x = new ArrayList();
// Define method that processes the callbacks on server.
public void RaiseCallbackEvent(String eventArgument)
{
x.Add("1");
x.Add("2");
x.Add("1");
x.Add("1");
x.Add("1");
x.Add("2");
x.Add("2");
x.Add("2");
}
// Define method that returns callback result.
public string GetCallbackResult()
{
string y;
y = "<table border='1px'><tr><td>";
for (int i = 0; i < x.Count; i++)
{
y += x[i];
y += "</td></tr><tr><td>";
}
y += "</td></tr>";
return y ;
}
protected void Page_Load(object sender, EventArgs e)
{
// Define a StringBuilder to hold messages to output.
StringBuilder sb = new StringBuilder();
// Check if this is a postback.
sb.Append("No page postbacks have occurred.");
if (Page.IsPostBack)
{
sb.Append("A page postback has occurred.");
}
// Write out any messages.
MyLabel.Text = sb.ToString();
// Get a ClientScriptManager reference from the Page class.
ClientScriptManager cs = Page.ClientScript;
String cbReference2 = cs.GetCallbackEventReference("'" +
Page.UniqueID + "'", "t", "ReceiveServerData2", "function ReceiveServerData2(t,context){"+
" document.getElementById('test').innerHTML=t;}",
"ProcessCallBackError", true);
//String cbReference2 = cs.GetCallbackEventReference("'" +
// Page.UniqueID + "'", "t", "ReceiveServerData2", "",
// "ProcessCallBackError", false);
String callbackScript2 = "function CallTheServer2(t, context) {" + cbReference2 + "}";
// Register script blocks will perform call to the server.
cs.RegisterClientScriptBlock(this.GetType(), "CallTheServer2",
callbackScript2, true);
}
}