asp.net|客户端
有时我们需要使用JavaScript回调服务端以避免回发过程中带来的页面刷新,这样不但减少了页面刷新的延时而且服务端无需处理每次回发的大量视图状态(View State)信息,应用程序的整体性能会有很大的提高。在ASP.NET 2.0中,引入了一个称为"客户端回调"的功能,利用这个内建的解决方案我们可以轻松实现客户端脚本和服务器端代码间的交互,从而避免了页面因回发带来的频繁刷新。
为了实现客户端回调,你的页面类必须实现一个ICallbackEventHandler接口。其声明如下:
using System;
namespace System.Web.UI
{
// 摘要:
// 用于指示控件可以作为服务器的回调事件的目标。
public interface ICallbackEventHandler
{
// 摘要:
// 返回以控件为目标的回调事件的结果。
//
// 返回结果:
// 回调的结果。
string GetCallbackResult();
//
// 摘要:
// 处理以控件为目标的回调事件。
//
// 参数:
// eventArgument:
// 一个字符串,表示要传递到事件处理程序的事件参数。
void RaiseCallbackEvent(string eventArgument);
}
}
而客户端的JavaScript要通过ClientScript.GetCallbackEventReference函数回调页面,以下是该函数的说明:
public string GetCallbackEventReference (Control control,string argument,string clientCallback,string context)
参数:
参数 | 作用 |
control | 处理客户端回调的服务器 Control。该控件必须实现 ICallbackEventHandler 接口并提供 RaiseCallbackEvent 方法。 |
argument | 从客户端脚本传递一个参数到服务器端的RaiseCallbackEvent 方法。 |
clientCallback | 一个客户端事件处理程序的名称,该处理程序接收服务器端事件返回的结果。 |
context | 启动回调之前在客户端的客户端脚本信息。脚本的结果传回给客户端事件处理程序。 |
返回值 | 调用客户端回调的客户端函数的名称。 |
下面是ClientScriptManager.GetCallbackEventReference 方法的重载列表
名称 | 说明 |
ClientScriptManager.GetCallbackEventReference (Control, String, String, String) | 获取一个对客户端函数的引用;调用该函数时,将启动一个对服务器端事件的客户端回调。此重载方法的客户端函数包含指定的控件、参数、客户端脚本和上下文。 |
ClientScriptManager.GetCallbackEventReference (Control, String, String, String, Boolean) | 获取一个对客户端函数的引用;调用该函数时,将启动一个对服务器端事件的客户端回调。此重载方法的客户端函数包含指定的控件、参数、客户端脚本、上下文和布尔值。 |
ClientScriptManager.GetCallbackEventReference (Control, String, String, String, String, Boolean) | 获取一个对客户端函数的引用;调用该函数时,将启动一个对服务器端事件的客户端回调。此重载方法的客户端函数包含指定的控件、参数、客户端脚本、上下文、错误处理程序和布尔值。 |
ClientScriptManager.GetCallbackEventReference (String, String, String, String, String, Boolean) | 获取一个对客户端函数的引用;调用该函数时,将启动一个对服务器端事件的客户端回调。此重载方法的客户端函数包含指定的目标、参数、客户端脚本、上下文、错误处理程序和布尔值。 我们就整个程序作个系统的说明,并且列出前台的页面代码和后台的逻辑代码,这样可以使得你对程序有个直观的理解。 |
下面是一个简单示例的源代码:
Default.aspx.cs:
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;
public partial class _Default : System.Web.UI.Page, System.Web.UI.ICallbackEventHandler
{
//定义一个字符串,回调的结果信息将保存在该字符串中
private string result;
//引发回调事件处理
public void RaiseCallbackEvent(string eventArgument)
{
result = "从服务器端返回的内容:" + eventArgument;
}
//回传回调结果
public string GetCallbackResult()
{
return result;
}
}
Default.aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!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>
</head>
<script type="text/javascript">
function CallServer(inputcontrol, context)
{
//回调还没有处理完全时其预先加载的显示值
context.innerHTML = "加载中......";
//为你在文本框中输入的信息,并且arg在这里就是将其值传递到
//RaiseCallbackEvent(String eventArgument)方法对应的eventArgument中
arg = inputcontrol.value;
//获取一个对客户端函数的引用;调用该函数时,将启动一个对服务器端事件的客户端回调。
<%= ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context")%>;
}
function ReceiveServerData(result, context)
{
context.innerHTML = result;
}
</script>
<body>
<form id="form1" runat="server">
<div>
请输入信息: <asp:TextBox ID="txtEnter" runat="server"></asp:TextBox>
<input id="Button1" type="button" value="回调服务端" onclick="CallServer(txtEnter,lblShow)" />
<br />
<asp:Label ID="lblShow" runat="server" Width="219px"></asp:Label>
</div>
</form>
</body>
</html>