65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET 2.0 中的客户端回调

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.83/5 (19投票s)

2006年5月24日

CPOL

5分钟阅读

viewsIcon

137829

downloadIcon

589

介绍 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_InitPage_Load 等。这就是客户端回调与 AJAX 区别开来的地方,因为在 AJAX 中,ASPX 页面不会加载到内存中,因此您无法访问 ViewState 或页面控件。但在客户端回调中却可以。

但是,在客户端回调中,会执行一个部分的页面生命周期,并且像 Pre_RenderRender 这样的事件不会触发,这是很合乎逻辑的,因为我们不希望完全刷新页面。下图将描述这两种情况下的页面生命周期。

正常的 ASP.NET 2.0 页面生命周期

客户端回调中的部分页面生命周期

带参数的客户端回调

您还可以将参数传递给服务器代码,但只能传递一个。传递参数非常简单。您需要做的就是将一些信息传递给动态生成的​​方法,该方法会自动将其传递给服务器。

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
© . All rights reserved.