ASP.NET 中的客户端回调






4.67/5 (2投票s)
ASP.NET 中的客户端回调
默认情况下,ASP.NET 页面通过一种称为“PostBack
”(回发)的机制与服务器通信。回发非常有用且高效,但有时也会遇到问题,例如:
- 当页面很大,需要在服务器上进行大量处理时,每次回发都进行所有处理不仅会浪费服务器资源,还会影响用户体验。
- 当你有客户端变量,这些变量会在页面刷新(即回发)时丢失。
你可以通过在应用程序中引入客户端 回调 来避免这两个限制。在客户端回调中,客户端事件会向服务器发出请求,此时页面会被初始化,其成员也会被创建。但是,页面会运行一个修改版的生命周期,并且只会调用标记为要调用的方法;该方法随后可以返回一个值,该值可以使用另一个客户端函数进行读取。
在此过程中,页面对用户仍然可用,并且由于客户端和服务器之间只交换少量数据,因此大多数情况下结果都很快。
要实现客户端回调,你需要同时在服务器端和客户端进行一些工作。
在服务器端,你需要:
- 在要使用回调的页面中实现
ICallBackEventHandler
接口。它有两个方法:RaiseCallbackEvent
和GetCallbackResults
。 - 为
RaiseCallBackEvent
提供实现。这是客户端调用的用于执行回调的方法。此方法接受一个string
作为参数。 - 为
GetCallbackResults
提供实现。这是服务器调用以处理请求并将结果作为string
返回给客户端的方法。 - 检索客户端函数的引用(使用
ClientScript.GetCallbackEventReference
方法)。此函数将在服务器端处理结果后被调用,并可用于处理来自服务器的任何结果。 - 使用
Page.ClientScript.RegisterClientScriptBlock
方法注册一个客户端脚本,该脚本将发起对服务器的调用。
在 客户端
,你需要:
- 实现上面第 4 步中作为参数提供的函数。
- 在客户端事件上调用上面第 5 步中注册的函数。
让我们来看一下用于实现客户端回调的代码。在我们的演示项目中,ASP.NET 页面上有两个下拉框。一个包含 部门
列表,另一个包含所选部门的 员工
列表。我们想要做的是,当用户在 部门
下拉框中更改部门时,在不进行回发的情况下,用相应的 部门员工
填充 员工
下拉框。
首先,实现 ICallbackEventHandler 接口
public partial class _Default : System.Web.UI.Page,ICallbackEventHandler
实现 ICallbackEventHandler
的两个方法
#region ICallbackEventHandler Members
/// <summary>
/// this method Returns the results of a callback event.
/// </summary>
/// <returns></returns>
public string GetCallbackResult() {
//as only strings can be sent back to the client, we are will iterate
//through the list of employees and convert it into comma delimited string
string employeelist="";
foreach (Department dept in departmetList)
{
if (dept.Name == deptArg)
{
foreach (Employee emp in dept.Employeelist)
{
employeelist += emp.Name;
employeelist += ",";
}
}
}
return employeelist;
}
/// <summary>
/// This method is invoked by the client, this will be used to receive parameter
/// values from the client
/// </summary>
/// <param name="eventArgument"></param>
public void RaiseCallbackEvent(string eventArgument) {
//right now all we are doing is to set the class level variable to eventArgument
//that was sent by the client, recall that it is departments name.
deptArg = eventArgument;
}
在 page_load
事件处理程序中,首先使用 ClientScriptManager.GetCallbackEventReference
检索将在回调结果时调用的客户端函数的引用。
string callbackEventReference = Page.ClientScript.GetCallbackEventReference(this,
"arg", "GetResults", "");
此方法有几个重载,我们使用的是一个需要目标(在此例中为“page
”)、由客户端传递的“argument
”、接收回调事件结果的客户端事件处理程序的名称以及上下文作为参数。Context
是在发出回调请求之前将要评估的任何客户端脚本。在此例中,我们传递了一个空的 string
。
然后,你需要构建并注册一个客户端脚本,该脚本将调用此 CallBackEventReference
。此脚本将发起对服务器的调用。
string callbackScript;
callbackScript = "function CallServer(arg){" + callbackEventReference + ";}";
//register callbackScript with the client using
// ClientScriptManager.RegisterClientScriptBlock
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "CallServer",
callbackScript, true);
这就是我们在服务器端代码中需要做的所有事情。现在,我们将看一下需要编写的客户端代码来完成我们的客户端回调。
首先,我们将在 aspx 文件中的脚本块中编写函数(使用 ECMAScript),即 GetResults
,这是我们之前在代码中引用的。
function GetResults(result)
{
if(result!="")
{
var array=result.split(",");
for (var i=0;i<array.length;i++) {
option = new Option(array[i],array[i]);
var slc_target = document.getElementById("ddlEmployee");
slc_target.options[i] = option;
}
}
else
{
//do something
}
}
此函数接受结果,它是一个 string
,并将其拆分为一个数组。然后,它所做的就是使用此数组绑定页面上的 combobox
“ddlEmployee
”。
最后,在另一个 combobox
“ddlDept
” 的客户端事件上,我们将调用我们使用服务器端代码注册的客户端函数 “CallServer
”,并将 部门
作为参数传递。
<asp:DropDownList Width="100" ID="ddlDept" runat="server"
OnChange="CallServer(ddlDept.value)">
我已将演示 VS 2008 解决方案 在此处 附加。运行项目后,您会看到,每当您在 部门
下拉框中更改任何值时,“员工
” 下拉框中的值都会刷新,而无需向服务器进行回发。
祝您编程愉快!