在 ASP.NET 网页的默认模型中,用户会与页交互,单击按钮或执行导致回发的一些其他操作。此时将重新创建页及其控件,并在服务器上运行页代码,且新版本的页被呈现到浏览器。但是,在有些情况下,需要从客户端运行服务器代码,而不执行回发。如果页中的客户端脚本维护一些状态信息(例如,局部变量值),那么发送页和获取页的新副本就会损坏该状态。此外,页回发会导致处理开销,这会降低性能,且会让用户不得不等待处理并重新创建页。
废话不多说,看源码
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>ICallbackEventHandler</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<script type="text/javascript">
function ReceiveServerData(rValue) { //声明一个JS方法
document.getElementById("result").innerHTML=rValue; //给DIV赋值
}
</script>
<div id="result"></div>
<input id="Button1" type="button" value="GetTime" onclick ="CallServer('GetTime')" />
<input id="Button2" type="button" value="GetDate" onclick ="CallServer('GetDate')" />
</div>
</form>
</body>
</html>
后置代码
using System;
using System.Data;
using System.Configuration;
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;//http://www.lordz.cn
//继承 System.Web.UI.ICallbackEventHandler
public partial class _Default : System.Web.UI.Page ,System.Web.UI.ICallbackEventHandler
{
public string CallBackValue = null;// 注册脚本到前台页面
protected void Page_PreRender(object sender, EventArgs e)
{
RegClientScript();
}
// javascript函数(服务器端事件的客户端回调)
protected void RegClientScript()
{
ClientScriptManager cs = Page.ClientScript;
string jstxt = @"
function CallServer(arg)
{
" + cs.GetCallbackEventReference(this, "arg", "ReceiveServerData", null) + @";
}";
cs.RegisterStartupScript(this.GetType(), "CallServer", jstxt, true);
}//ICallbackEventHandler接口
//把值传到前台
string ICallbackEventHandler.GetCallbackResult()
{
return CallBackValue;
}//按受前台的参数
void ICallbackEventHandler.RaiseCallbackEvent(string eventArgument)
{
switch (eventArgument)
{
case "GetTime":
this.CallBackValue = DateTime.Now.ToShortTimeString();
break;
case "GetDate":
this.CallBackValue = DateTime.Now.ToShortDateString();
break;
default:
this.CallBackValue = "NULL";
break;
}
}
}
/*
* 1.继承ICellbackEventHendler,实现接口
* 2.向前台注册个回调方法
* 3.通过RaiseCallbackEvent方法接收到前台传上的值
* 4.在RaiseCallbackEvent方法中做完后,通过GetCallbackResult方法返回值,并调用传上的方法
* 5.实现回调
*/
获取一个对客户端函数的引用;调用该函数时,将启动一个对服务器端事件的客户端回调。
参数描述
control
处理客户端回调的服务器 Control。该控件必须实现 ICallbackEventHandler 接口并提供 RaiseCallbackEvent 方法。
target(用control.UniqueID获得)
处理客户端回调的服务器 Control 的名称。该控件必须实现 ICallbackEventHandler 接口并提供 RaiseCallbackEvent 方法。
argument(用来传递字符串对象给服务器端,RaiseCallbackEvent 方法中接收参数可获取此值)
从客户端脚本传递给服务器端的一个参数
clientCallback(回调成功后触发该脚本函数,此处用于注册该名称)
一个客户端事件处理程序的名称,该处理程序接收成功的服务器端事件的结果。
context(可以传入一个脚本函数或一个客户端对象,下面将介绍两种不同的表现方式)
启动回调之前在客户端计算的客户端脚本。脚本的结果传回客户端事件处理程序。
clientErrorCallback(回调失败后触发该脚本函数,此处用于注册该名称)
客户端事件处理程序的名称,该处理程序在服务器端事件处理程序出现错误时接收结果。
useAsync
true 表示同步执行回调;false 表示异步执行回调。
重载列表
名称 说明
ClientScriptManager.GetCallbackEventReference (Control, String(argument), String(clientCallback), String(context)) 获取一个对客户端函数的引用;调用该函数时,将启动一个对服务 器端事件的客户端回调。此重载方法的客户端函数包含指定的控件、参数、客户端脚本和上下文。
ClientScriptManager.GetCallbackEventReference (Control, String(argument), String(clientCallback), String(context), Boolean) 获取一个对客户端函数的引用;调用该函数 时,将启动一个对服务器端事件的客户端回调。此重载方法的客户端函数包含指定的控件、参数、客户端脚本、上下文和布尔值。
ClientScriptManager.GetCallbackEventReference (Control, String(argument), String(clientCallback), String(context), String(clientErrorCallback), Boolean) 获取一个对客户端函数的引用;调用该函数时,将启动一个对服务器端事件的客户端回调。此重载方法的客户端函数包含指定的控件、参数、客户端脚本、上下 文、错误处理程序和布尔值。
ClientScriptManager.GetCallbackEventReference (String(target), String(argument), String(clientCallback), String(context), String(clientErrorCallback), Boolean)