自适应控件行为的结构概述

更新:2007 年 11 月

本主题概述了 ASP.NET 的自适应控件行为结构。使用此结构可扩展控件呈现以适合很多不同类型的浏览器,包括移动设备上的浏览器。

自适应控件行为是为目标设备自定义的控件行为。ASP.NET 提供了一个自适应结构,允许使用自定义行为截获和替换控件的关键生命周期阶段。默认情况下,每次请求时,ASP.NET 页框架将适配器的单个实例映射到每个控件。大多数情况下,此默认映射的灵活性足以满足大多数开发人员的需要。特殊情况下,可以派生自定义适配器,并将其映射到控件,以满足对某个给定设备或设备族上的控件行为的附加要求。

自适应控件行为的一个常见示例是自适应呈现,在此呈现中,ASP.NET 网页将针对浏览器或标记进行特定呈现。编写支持使用不同标记语言的浏览器的应用程序时,这特别有用。可以使用多种方式控制 ASP.NET 中网页的自适应呈现,包括指定应用程序的默认 XHTML 呈现,以及提供自定义 ControlAdapter 对象。提供自定义 ControlAdapter 对象是高级任务,大部分用户方案都不要求此任务。

可以通过以下方式控制自适应呈现:

  • 配置应用程序以呈现多个标记。

  • 使用 XhtmlTextWriterChtmlTextWriter 类来自定义控件标记和属性。

  • 创建自定义 TextWriter 类以呈现输出。

  • 使用声明性设备标记或浏览器筛选来影响如何基于设备筛选器定义设置控件属性。

  • 提供一个自定义控件适配器,使您能够以适配器生命周期方法替换控件的默认生命周期方法。

除了自适应呈现,可以根据目标设备修改或指定的其他控件行为包括:

  • 处理回发数据。

  • 管理视图状态。

  • 防止修改自定义控件。

ASP.NET 页和控件呈现

默认呈现

在 ASP.NET 网页的默认呈现中,创建了一个 HtmlTextWriter 类的实例,并使用设置为 HtmlTextWriter 类的实例的参数以递归方式调用 RenderControl 方法。页面控件层次结构中的每个控件均将其标记附加到 HtmlTextWriter 对象的末尾。产生的 HtmlTextWriter 的内容是在产生的浏览器中呈现的内容。

向客户端呈现 HTML 3.2 内容时,ASP.NET 自动使用 Html32TextWriter 类。为了确定使用的 TextWriter 对象类型,ASP.NET 页框架查询 Browser 对象的 TagWriter 属性。

默认情况下,使用支持 HTML 4.0 或更高版本的浏览器时,ASP.NET 页和控件呈现符合 XHTML 1.0 Transitional 标准的标记。若要指定 ASP.NET 是否呈现符合 XHTML 标准的标记,请配置应用程序的 Web.config 文件中的 xhtmlConformance 元素(ASP.NET 设置架构)。有关 ASP.NET 和 XHTML 的更多信息,请参见 ASP.NET 和 XHTML。 有关页生命周期的更多信息,请参见 ASP.NET 页生命周期概述

使用自定义 TextWriter 对象

默认情况下,ASP.NET 为请求的设备使用相应的 TextWriter 对象。如果需要更多地控制 TextWriter,可以使用从 HtmlTextWriter 类继承的现有类,或者可以创建自定义文本编写器。

XhtmlTextWriterChtmlTextWriter 类是 ASP.NET 页框架中的两个类,分别从 HtmlTextWriterHtml32TextWriter 类继承。XhtmlTextWriterChtmlTextWriter 类提供其他自适应呈现功能。例如:

  • XhtmlTextWriter 类可用于向移动设备呈现 XHTML 标记,并提供用于自定义已呈现的 XHTML 元素的属性的方法。

  • ChtmlTextWriter 类可用于将 cHTML(即压缩 HTML)呈现到内存和 CPU 能力有限、显示屏幕较小、格式化能力有限以及输入选项数量有限的设备(如移动电话触控板)上。

如果创建自定义文本编写器或希望指定特定文本编写器来为特定设备呈现输出,必须将文本编写器映射到使用位于应用程序的 .browser 文件中的 controlAdapters 元素的 markupTextWriterType 属性的设备。

设备筛选

设备筛选使您能够以声明的方式自定义 Web 服务器控件属性的输出呈现方面的内容。可以将筛选应用于控件属性 (Property)、自定义属性 (Attribute) 和模板。还可以在 @ Page@ Control 指令的一些属性上使用设备筛选。如果为一个属性 (Property) 或属性 (Attribute) 指定了多个设备筛选器,将优先使用最具体的筛选器。

  1. 用于筛选输出的设备筛选器定义以浏览器类型的定义(在应用程序中定义)为基础。默认的浏览器定义文件位于 %SystemRoot%\Microsoft.NET\Framework\versionNumber\CONFIG\Browsers 目录下。在应用程序的 App_Browsers 文件夹中指定的浏览器定义文件与默认定义文件合并。

有关设备筛选的更多信息,请参见 ASP.NET 设备筛选概述。有关 .browser 文件格式的更多信息,请参见 浏览器定义文件架构(browsers 元素)

控件适配器

概述

为了自定义页面或控件的行为,ASP.NET 可让您指定一个 ControlAdapter 对象,以用来在控件生命周期的关键点改编或修改行为。生命周期的每个阶段均会调用生命周期方法,在每个阶段中,ASP.NET 页框架检查控件是否有关联的适配器,并调用适配器的关联方法而不是控件的方法。许多情况下,适配器方法直接推迟回控件的方法。此行为的例外情况是,自适应行为中状态管理的适配器附加到控件的状态。

希望使用控件适配器重写控件行为的情况如下:

  • 在控件生命周期的特定阶段提供目标特定的处理。

    例如,可以使用 ControlAdapter 类的 OnInit 方法来执行初始化任务,这些任务特定于适配器所附加到的控件以及要控件呈现到的目标设备。

  • 自定义目标特定呈现。

    例如,可以使用 RenderRenderChildren 方法来生成目标特定标记。

WebControlAdapter 和 PageAdapter 控件

ControlAdapter 类是一个抽象类,它定义所有适配器的基本功能。它用作 WebControlAdapterPageAdapter 类的基类。

WebControlAdapter 类是呈现从 WebControl 类自适应地继承的控件的起始点。除了 ControlAdapter 类方法之外,WebControlAdapter 类也添加几个特定于呈现标记的方法。

抽象 PageAdapter 类是自适应地呈现网页的起始点。

另外,PageAdapter 类定义在典型页级别任务(如缓存或管理页面状态持久性)的上下文中启用自适应呈现的属性和方法。例如,除了根据与目标无关的参数缓存页面之外,可能还必须根据目标浏览器的类型进行缓存。在这种情况下,重写 PageAdapter 类的 CacheVaryByParams 属性,以返回一个附加 GET 或 POST 参数的列表,从而控制目标特定缓存。

与自定义文本编写器相似,为了使 ASP.NET 页框架可以识别自定义控件适配器,必须在应用程序的 .browser 文件的 controlAdapters 元素中定义自定义控件适配器。有关 .browser 文件格式的更多信息,请参见 浏览器定义文件架构(browsers 元素)

用于创建适配器的设计方案包括以下准则:

  • Control 类继承的控件必须有一个从 ControlAdapter 类继承的适配器。

  • WebControl 类继承的控件必须有一个从 WebControlAdapter 类继承的适配器。

  • 如果开发人员创建需要扩展适配器功能的自定义控件,则应该为这些控件创建基类适配器。

请参见

概念

ASP.NET 页生命周期概述

ASP.NET 和 XHTML

ASP.NET 设备筛选概述

参考

xhtmlConformance 元素(ASP.NET 设置架构)

浏览器定义文件架构(browsers 元素)

其他资源

开发自定义 ASP.NET 服务器控件