UpdatePanel 控件

UpdatePanel 控件

使用了 UpdatePanel 控件的方案是 ASP.NET AJAX 扩展中的重要方案。我们收到了许多关于此控件、UpdateProgress 控件以及二者功能的客户反馈。我们已经通过大量更改改善了部分页面呈现,并支持构建与 UpdatePanel 控件兼容的控件。我们还针对异步回发生命周期实现了丰富的事件模型,使您能够自定义客户端的更新处理。

ScriptManager 控件

Beta 2 更改:ScriptManager 控件提供了 SupportsPartialRendering 属性,该属性的初始值是从服务器上的浏览器功能派生而来的。对于不支持部分页面呈现的浏览器,应将 UpdatePanel 控件回退到使用常规回发。

Beta 2 更改:ScriptManager 控件提供一个兼容 SetFocus API,它使开发人员能够在浏览器中管理焦点。

Beta 2 更改:ScriptManager 控件提供了 RegisterDispose 方法,可在注册客户端组件时作为可释放对象进行调用。这意味着组件需要将相关的 DOM 元素与 UpdatePanel 控件放在一起使用。

RC 更改:ScriptManager 类中新增了一种 RegisterDispose 方法,它使控件和扩展器能够将其客户端组件作为可释放对象进行注册,而不需要使用 DOM 元素。这一操作是在 ScriptDescriptor 类型中自动完成的。

RTM 更改: 参见之前部分对静态脚本注册方法新重载的说明,它将 Page 对象而非 Control 对象视为参数。

在 RTM 版本中,ScriptManager 控件具有 EnablePartialRendering 属性,其默认值为 true。这减少了使用 UpdatePanel 控件定义异步回发时所需的步骤。

为了降低控件的复杂程度,已将 ScriptManager 的 ErrorTemplate 属性从 RTM 版本中删除。如今的错误处理模式更具灵活性,例如创建独立的新服务器控件。另外,您还可以通过 ScriptManager 的 AsyncPostBackErrorMessage 属性添加错误处理。它仅仅设置了默认的错误信息。若要动态自定义消息,则可以处理 AsyncPostBackError 事件。

现在,ScriptManager 提供了一个 AsyncPostBackTimeout 属性,以控制异步回发的超时时间。

ScriptManager 控件支持服务器控件可能需要的新资源注册方法。这些方法增加了对 UpdatePanel 方案的支持,并降低了 CTP 版本中 UpdatePanel 控件的复杂性。资源可包括脚本、样式、隐藏字段等等。脚本注册方法与 ClientScriptManager 方法相对应。它们能够接受将控件实例作为参数,因此如果 UpdatePanel 服务器控件中包含了已经注册脚本的控件,则此控件将能够被正确跟踪。

动态 UpdatePanel 控件

现有两种方法可将 UpdatePanel 控件动态添加到页面中,而且这两种方法已在 RTM 版本中得到改进。使用动态 UpdatePanel 控件的两种方法是:

  • 控件开发人员可以将 UpdatePanel 控件添加到其自定义复合控件中。如果此页面中存在 ScriptManager 控件,而且其 EnablePartialRendering 属性被设置为 true,则 UpdatePanel 控件可从自定义控件内部启用异步回发。如果页面中不存在 ScriptManager 控件,它还将提供回退到常规回发的能力。
  • 页面开发人员可以将 UpdatePanel 控件添加到其他控件的模板中。

以下代码说明了在自定义控件中对 UpdatePanel 控件的使用。

protected override void CreateChildControls() {
    base.CreateChildControls();

    ScriptManager sm = ScriptManager.GetCurrent(Page);
    Control parent;
    Control container;
    if (sm == null || !sm.EnablePartialRendering) {
        // 如果进行的不是部分呈现,请使用
        // 虚拟控件作为容器。
        parent = container = new Control();
    }
    else {
        // 创建 UpdatePanel 控件。
        UpdatePanel up = new UpdatePanel();

        // 不将子控件直接添加到 
        // UpdatePanel 控件,而是将它们添加到其 
        // ContentTemplateContainer。
        container = up.ContentTemplateContainer;
        parent = up;
    }

    AddDataControls(container);
    Controls.Add(parent);
}

异步回发期间的客户端事件

在 CTP 版本中,客户端 PageRequestManager 对象通过创建 XMLHttpRequest 对象和处理响应执行异步回发。在 RTM 版本中,PageRequestManager 对象提供了异步回发生命周期事件,因此,您可以自定义处理请求和响应的方式。以下是可用的客户端事件,以及可提供附加信息的相应事件参数。

  • initializeRequest: 您可以使用此事件来取消即将发出的新异步回发请求。此事件还支持您评估回发源,并完成任何其他所需的工作。此事件参数属于 InitializeRequestEventArgs 类型。
  • beginRequest:您可以使用此事件来完成诸如显示进度方面的工作。在此事件期间开始显示,并在 endRequest 事件期间隐藏显示。此事件参数属于 BeginRequestEventArgs 类型。
  • pageLoading: 您可以使用此事件来对正在进行更新或删除操作的面板执行其他处理,如运行清理代码。您还可以检查自服务器发送来的其他所有数据,以执行自定义工作。此事件参数属于 PageLoadingEventArgs 类型。
  • pageLoaded: 此事件与 pageLoading 类似,但却提供了由于异步回发而创建的其他所有 UpdatePanel 控件的相关信息。此事件参数属于 PageLoadedEventArgs 类型。
  • endRequest: 您可以使用此事件来自定义错误处理,并处理自服务器发送的其他数据。您还可以将其用于隐藏 UpdateProgress 控件。此事件参数属于 EndRequestEventArgs 类型。

开发与 UpdatePanel 控件兼容的控件

RTM 重要更改:在 ASP.NET 2.0 AJAX Extensions 1.0 最终版本中,Beta 和 RC 版本中包括的要与异步回发兼容的 ASP.NET AJAX 控件验证程序被删除。这可以避免与一组即将要在 .NET Framework 更新中发布的新验证程序产生冲突。

对于需要在已部署的应用程序中使用验证程序的应用程序开发人员来说,他们可以在名为 ASP.NET AJAX Validators(英文)的博客中了解到有关删除验证程序的信息以及使用验证程序解决问题的方法。博客中包括验证程序的源代码,开发人员可在必要时将其应用到应用程序中。

在提供 .NET Framework 更新时,应该尽快安装此更新,以便更新的验证程序可供宿主应用程序使用。

在 CTP 版本中,UpdatePanel 控件处理了许多被呈现的对象,其中还包括一些不在 UpdatePanel 控件中的对象,然后尝试在页面上对所有更改进行完全更新。这使一些控件无法与 UpdatePanel 控件兼容。例如,在 CTP 版本中,如果动态添加或删除了 ASP.NET 验证程序控件,那么,这些控件将不会在 UpdatePanel 中正常工作,例如使用 Wizard 控件在每一步对用户输入进行验证的时候。

而在 RTM 版本中此模式已得到改进。若要将脚本或数据发送到客户端,应该使用 ScriptManager 控件对其进行注册,这与注册脚本库的方式相同。以下示例展示了 RTM 版本中与 UpdatePanel 控件兼容的自定义控件。

protected override void OnPreRender(EventArgs e) {
    base.OnPreRender(e);

    Control control = FindControl(_controlID);

   // 通过新的 ScriptManager API 注册脚本。
   // 脚本与新 PageRequestManager 事件联系起来。
   string script = String.Format(
   CultureInfo.InvariantCulture,
   @"var {0}_hover = new Microsoft.Samples.HoverExtender(document.getElementById('{1}'), '{2}');
{0}_hover.attach();
",
   ClientID,
   control.ClientID,
   ColorTranslator.ToHtml(BackgroundColor));

   ScriptManager.RegisterClientScriptInclude(
       this, typeof(HoverExtender), "HoverExtenderScript",
        ResolveClientUrl("~/ScriptLibrary/HoverExtender.js"));
        ScriptManager.RegisterStartupScript(
            this, typeof(HoverExtender), ClientID, script, true);
}
 

你可能感兴趣的:(Ajax,浏览器,服务器,脚本,asp.net,XMLhttpREquest)