UpdatePanel 控件

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

大家好,又见面了,我是你们的朋友全栈君。

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);
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/163532.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • DELPHI XE5安装

    DELPHI XE5安装1.安装XE52.HNFJ-DPADCW-BDWCFU-FPNNQDF4-CTSDHV-RDFCFE-FEANHNFK-BCN8NN-78N53D-H4RS激活成功教程补丁使用方法:(1).复制压缩包内的“R

    2022年7月1日
    24
  • 二次开发mysql数据反推_Discuz二次开发之数据库操作

    二次开发mysql数据反推_Discuz二次开发之数据库操作一、discuz数据操作之查:1、fetch_allDB::fetch_all(sql,$arg=array());//取出符合条件的所有数据sql为查询语句,$arg为绑定参数例:$result=DB::fetch_all(‘SELECT*FROM%t’,array(‘table_name’));$result为二维数组2、fetch_firstDB::fetch_first(s…

    2022年5月19日
    34
  • nginx开源_NGINX反向代理

    nginx开源_NGINX反向代理Nginx源码分析-初探Nginx的架构 Nginx源码分析-基础数据结构篇-内存池ngx_palloc.c Nginx源码分析-基础数据结构篇-数组结构ngx_array.c Nginx源码分析-基础数据结构篇-缓冲区结构ngx_buf.c Nginx源码分析-基础数据结构篇-双向链表结构ngx_queue.c Nginx源码分析……

    2022年8月13日
    4
  • 肠子的小心思(一):排便便的奥秘

    肠子的小心思(一):排便便的奥秘

    2022年3月2日
    46
  • SpringBoot整合Druid「建议收藏」

    SpringBoot整合Druid「建议收藏」SpringBoot整合DruidDruid简介配置数据源配置Druid数据源监控Druid数据源具有监控的功能,并提供了一个web界面方便用户查看,类似安装路由器时,人家也提供了一个默认的web页面。Druid简介Java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,又不得不使用数据库连接池。Druid是阿里巴巴开源平台上一个数据库连接池实现,结合了C3P0、DBCP等DB池的优点,同时加入了日志监控。Druid可以很好的监控DB池连接和SQL的执行情

    2022年7月23日
    23
  • HashMap的扩容机制—resize()「建议收藏」

    HashMap的扩容机制—resize()「建议收藏」 HashMap的扩容机制—resize()什么时候扩容:当向容器添加元素的时候,会判断当前容器的元素个数,如果大于等于阈值(知道这个阈字怎么念吗?不念fa值,念yu值四声)—即当前数组的长度乘以加载因子的值的时候,就要自动扩容啦。扩容(resize)就是重新计算容量,向HashMap对象里不停的添加元素,而HashMap对象内部的数组无法装载更多的元素时,对象就需要扩大数组的…

    2022年6月15日
    38

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号