ASP.NET AJAX UpdatePanel控件


  本文标签:UpdatePanel控件 ASP.NET

  不论好坏,UpdatePanel控件都是 ASP.NET AJAX 社区所喜爱的  。我说“好”,是因为 UpdatePanel 使部分页面呈现变得相当简单,而说“坏”,是因为它的简便和易用性是以效率和令人啼笑皆非的带宽为代价的  。

  UpdatePanel 可以为一般的网页带来 AJAX 神奇的好处,但是它不能提供我们与 AJAX 正常关联的高效性  。例如,您是否知道,当 UpdatePanel控件对服务器执行异步 AJAX 回调以更新其内容时,这个请求包含了常规 ASP.NET 回发所包含的一切,其中还包括视图状态呢?大多数开发人员会以为 AJAX 取消了视图状态  。而 UpdatePanel 的 AJAX 品牌却并非如此  。

  如果您准备使用 UpdatePanel控件,您需要清楚您在准备干什么  。在许多情况下,从性能的角度而言,应用程序最好是不使用 UpdatePanel,而是使用对 WebMethods 或页面方法的异步调用  。这样做可能会大幅度降低网络传输中的数据量  。但是,它也是一个根本转变,在这里 UI 更新需要由开发人员使用该页面上的 JavaScript 来进行显式处理  。

  此外,ASP.NET AJAX 论坛上到处都有关于自定义 UpdatePanel 的提问  。其实,只要您了解为 UpdatePanel 提供客户端支持的 Microsoft? AJAX Library 中的 PageRequestManager、JavaScript 类,这里面许多问题就可以迎刃而解  。

  既然已经提供了 ASP.NET AJAX,我想进一步检查一下 UpdatePanel,从而进一步了解您可以如何对其进行自定义和优化,甚至在没有它的情况下如何运行  。这恰恰也是本期专栏包含的全部内容  。

  更新突出显示

  有时候您无法帮助 Microsoft 的开发人员,而只能对他们表示遗憾  。如果他们不能将工作做得足够好,就会遭到公众的抨击  。然而,有时候他们的工作做得很出色,也会遭到抨击  。例如,我最近收到了一位客户的电子邮件,抱怨 ASP.NET AJAX UpdatePanel 运行得有点过头了  。

  UpdatePanel 使 ASP.NET 页面回发到服务器,并将它变为流畅、无闪烁的更新时出现闪光和闪烁变得极其简单  。UpdatePanel 可以通过将回发转换成异步回调(XML-HTTP 请求),以及使用客户端上的 JavaScript 以刷新由 UpdatePanel控件封装的页面的一部分来发挥它的魔力  。闪光和闪烁会消失,因为浏览器不会将该页面重新绘制成与它在回发期间的一样  。

  客户的抱怨是,用户有时候不会注意到页面的那个部分已经更新了新内容  。他的问题很简单:ASP.NET AJAX 团队的工作人员是否能使

  updatePanel 闪烁再多一点,以便用户不会错过重要的更新?

  不幸的是,ASP.NET AJAX 团队可能对制造 UpdatePanel 闪烁没什么兴趣  。毕竟,消除闪烁才是发明 UpdatePanel 的初衷  。但值得高兴的是,您可以在浏览器中使用 AJAX 的一些神奇功能,以吸引对已更新的 UpdatePanel 的注意  。秘诀在于 Microsoft AJAX Library(由客户端一半的 ASP.NET AJAX 组成的 JavaScript 类的库)中的 Sys.WebForms.PageRequestManager 类  。PageRequestManager 可以管理由 UpdatePanel 启动的异步回调  。它还负责在异步回调完成后更新 UpdatePanel 内的内容  。

  PageRequestManager 可以在更新前和更新后激发浏览器中的事件  。您可以将 JavaScript 中的这些事件关联起来,并运行可以提醒用户注意更新内容的代码  。关键事件被命名为 pageLoaded.此事件每次都会激发浏览器中的页面加载(它类似 Page_Load in ASP.NET)  。它每次还会激发代表 UpdatePanel控件完成而启动的异步回调,并且会更新这个 UpdatePanel 中的内容  。您可以使用两行代码(可以合并为一行)注册 pageLoaded 事件的 JavaScript 处理程序:

  var prm = Sys.WebForms.PageRequestManager.getInstance();prm.add_pageLoaded(pageLoaded);

  第一行获得对该页面的 PageRequestManager 对象的引用  。第二行注册名为 pageLoaded 的 JavaScript 函数,作为 pageLoaded 事件的处理程序  。

  调用时,pageLoaded 事件处理程序会收到一个 Sys.WebForms.PageLoadedEventArgs 类型的参数,它是 Microsoft AJAX Library 中的另一个类  。PageLoadedEventArgs 包含一个 get_panelsUpdated 方法,您可以调用该方法来枚举所有的 UpdatePanel(如果有),其内容刚刚已更新  。在默认情况下,UpdatePanel 就是客户端上的 DIV,因此您可以使用 JavaScript 来使该 DIV 闪光,突出显示它,或对它执行任何您想要的操作,以提醒用户注意它  。