ASP.NET 2.0 中的客户端回调






4.83/5 (19投票s)
介绍 ASP.NET 2.0 中客户端回调的概念。
引言
客户端回调是 ASP.NET 的一项有趣功能,它允许通过 XmlHTTP
从客户端 JavaScript 调用服务器代码。在本文中,我将首先讨论客户端回调,然后将其优势与 AJAX 进行比较。
在 ASP.NET 1.1 中使用 AJAX 是一项非常繁琐的任务。首先,您需要将 AJAX DLL 复制到 bin 文件夹,然后在 Web.Config 中将其注册为 HttpHandler。事情并未就此结束,因为您计划使用的每个页面都需要通过调用 AJAXUtility.RegisterForAJAXType (this.GetType ())
来进行注册。然后,就需要编写实际的客户端和服务器端代码了。
在 ASP.NET 2.0 中,运行时承担了注册 HTTP 处理程序、页面类型等的责任,从而简化了客户端脚本回调的过程。因此,在本文中,我将详细讨论它。
ASP.NET 引入了一个名为 ICallBackEventHandler
的新接口。页面需要实现此接口才能支持客户端回调。它有两个方法:
RaiseCallbackEvent
:处理目标控件的回调事件。当客户端脚本调用服务器代码时,此方法是执行点。GetCallbackResult
:返回目标控件的回调事件的结果。结果通常由RaiseCallBackEvent
返回,并存储在某个类成员中。
客户端回调实战
让我们看一个非常基本的客户端回调示例,其中客户端按钮的单击会触发服务器代码,该代码返回一个简单的文本消息以在客户端的文本框中显示。
实现 ICallbackEventHandler
public partial class _Default : System.Web.UI.Page, ICallbackEventHandler
{
string callbackResult;
protected void Page_Load(object sender, EventArgs e)
{
// will discuss this later
}
public void RaiseCallbackEvent(string eventArgument)
{
// perform some real operation
callbackResult = "DotNET Rocks!";
}
public string GetCallbackResult()
{
return callbackResult;
}
}
上面的代码非常简单。RaiseCallbackEvent
执行一些操作并将结果存储在 callbackresult
变量中,该变量由 GetCallbackResult
方法返回。下一步是编写一些 JavaScript 代码来触发此回调。
<script type="text/javascript">
function GetMessageFromServer()
{
UseCallBack();
}
function JSCallback(TextBox1, context)
{
// when callback finishes execution this method will called
document.forms[0].TextBox1.value = TextBox1;
}
</script>
GetMessageFromServer
将使用 UseCallback
方法触发服务器代码。这是一个从代码隐藏生成的动态方法;稍后会详细介绍。JSCallback
是服务器回调完成执行时调用的客户端方法。
所以,我在这里所做的只是将服务器消息复制到文本框中。
单击以下 HTML 按钮将调用该方法。
<input type="button" id="Button1" runat="server" value="Get Message"
onclick="GetMessageFromServer()"/>
现在到了使用客户端回调的最后也是最重要的一步。此步骤实际上负责生成将调用 Framework 方法以进行实际 XmlHttp
调用的 JavaScript。通常,这段代码片段出现在 Page_Load
事件中。
protected void Page_Load(object sender, EventArgs e)
{
// get reference of call back method named JSCallback
string cbref = Page.ClientScript.GetCallbackEventReference(this,
"arg", "JSCallback", "context");
// Generate JS method trigger callback
string cbScr = string.Format("function UseCallBack(arg," +
" context) {{ {0}; }} ", cbref);
Page.ClientScript.RegisterClientScriptBlock(this.GetType(),
"UseCallBack", cbScr, true);
}
上面的 C# 代码在运行时生成以下 JavaScript:
function UseCallBack(arg, context)
{
WebForm_DoCallback('__Page',arg,JSCallback,context,null,false);
}
这实际上会在后台调用 XmlHttp
,最终导致服务器代码回调。就是这样。在服务器代码完成执行后,Framework 将调用指定的 JavaScript 方法来通知回调的完成,在这种情况下,是函数 JSCallback(TextBox1, context)
。
客户端回调的内部机制
您可能想知道 XmlHttp
对象在哪里,以及 Framework 是如何在后台调用服务器回调的。好吧,如果您查看页面的生成 HTML,您会看到一个有趣的脚本声明:
<script src=https://codeproject.org.cn/<AppName>/WebResource.axd?d=v...&t=63...0
type="text/javascript"></script>
如果在浏览器中打开上述 URL,您将看到负责服务器调用和客户端通知的库函数和对象的完整定义。
前一段代码中的另一个有趣之处是 Page
类的 ClientScript
属性。此属性表示 ClientScriptManager
类的实例,该类包含客户端脚本的所有相关内容,并包含许多对客户端脚本有用的方法。
GetCallbackEventReference
是其中一个方法,它返回一个对客户端函数的引用,该函数在调用时会启动到服务器端事件的客户端回调。
客户端回调中的页面生命周期
客户端回调脚本的一个有趣且独特的特性是,在调用服务器回调时,ASPX 页面会加载到内存中并执行正常的页面生命周期事件,例如 Page_Init
、Page_Load
等。这就是客户端回调与 AJAX 区别开来的地方,因为在 AJAX 中,ASPX 页面不会加载到内存中,因此您无法访问 ViewState 或页面控件。但在客户端回调中却可以。
但是,在客户端回调中,会执行一个部分的页面生命周期,并且像 Pre_Render
、Render
这样的事件不会触发,这是很合乎逻辑的,因为我们不希望完全刷新页面。下图将描述这两种情况下的页面生命周期。
带参数的客户端回调
您还可以将参数传递给服务器代码,但只能传递一个。传递参数非常简单。您需要做的就是将一些信息传递给动态生成的方法,该方法会自动将其传递给服务器。
function GetMessageFromServer()
{
var parameter = “some paramter”;
UseCallBack(parameter, "");
}
public void RaiseCallbackEvent(string eventArgument)
{
// process eventargument
callbackResult = “some result”;
}
客户端回调与 AJAX 对比
以下是客户端回调相对于 AJAX 的一些优点:
- 由于由 Framework 承担,客户端回调的实现是一致的,而 AJAX 有各种实现且缺乏标准化。
- 客户端回调的页面生命周期结果执行意味着服务器回调可以访问 ViewState 和表单控件。
- 无需在配置文件中注册 HttpHandler。
- 在客户端回调中,开发人员无需编写 JavaScript 代码。相反,他们可以使用动态且不易出错的方法调用
Page.ClientScript.GetCallbackEventReference
。
结论
客户端回调是 ASP.NET 2.0 中最令人兴奋的功能之一,它允许通过 XmlHttp
异步调用服务器代码,这也称为 AJAX。客户端回调脚本提供了一些优势,例如可以访问 ASPX 页面的 ViewState 和 Forms
集合,而 AJAX 则不具备这些。
您的反馈和评论随时欢迎。
参考文献
- ASP.NET v. 2.0 概览,Addison Wesley,ISBN 0-321-22896-0
- 专业 ASP.NET 2.0,Wrox Press,ISBN 10: 0-7645-7610-0