ControlAdapter 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
自定义附加了适配器的派生控件的呈现,以修改特定浏览器的默认标记或行为,是所有控件适配器都可以继承的基类。
public ref class ControlAdapter abstract
public abstract class ControlAdapter
type ControlAdapter = class
Public MustInherit Class ControlAdapter
- 继承
-
ControlAdapter
- 派生
注解
控制适配器是替代其执行生命周期中某些 Control 类方法和事件的组件,以允许浏览器或特定于标记的处理。 .NET Framework将单个派生控件适配器映射到Control每个客户端请求的对象。
适配器修改特定浏览器或浏览器类的控件,或者充当某些功能的任意筛选器。 通常,适配器由浏览器使用的标记语言定义 (,例如 XHTML 或 HTML 3.2) 。 呈现行为的很多适应性都可以封装在派生自类的 HtmlTextWriter 专用类中。 因此,单个适配器可能用于许多浏览器类行为,或者包含类中的 HtmlTextWriter 可适应性可能会导致不必要的控制适配器使用。
控件类的适配器适用于从该类继承的所有控件,除非存在更专用的适配器。 例如,该类的 BaseValidator 适配器可用于所有 Validator
对象。
适配器通常不直接从 ControlAdapter 类继承,而是从特定于目标的适配器基类之一继承,这些基类提供特定于控件类型和目标浏览器的其他功能或所需的特定呈现。
控件本身不一定需要适配器。 如果控件通过组合进行扩展,则子控件适配器通常足够。
每个控件通过 .browser 定义文件显式映射到适配器。 因此,对属性的任何访问 Control.Adapter 都使用 HttpBrowserCapabilities 从浏览器定义文件中提取的对象来执行对适配器进行控制映射的查找。
在处理过程中,.NET Framework截获对可能特定于目标的控件的可重写方法的调用。 如果附加了控件适配器,.NET Framework将调用关联的适配器方法。
适配器通过 Render 方法为控件执行呈现。 如果重写, Render 则可能不应调用基类实现,因为该实现对方法执行回 Control.Render 叫。 这可能会导致呈现发生两次,一次由适配器和一次由控件执行。
基 Render 方法调用控件 Control.Render 的方法。 因此,如果重写 Render,则不应调用基类实现,除非实现的呈现是控件提供的 Control.Render 。
必须确保.NET Framework对子控件的适配器执行拦截。 可以通过调用Render基方法(从替代调用Control.RenderChildren控件的方法)来执行此操作RenderChildren。
控件BeginRender在 (之前和之后分别) 控件调用Render该方法和EndRender方法。 如果预呈现和后期呈现是唯一需要浏览器特定的处理任务,则使用 BeginRender 并 EndRender 可能不需要重写 Render。 和EndRender方法的默认行为BeginRender是调用相应的HtmlTextWriter方法。
若要维护其自己的状态信息,控制适配器可以替代 SaveAdapterControlState、 LoadAdapterControlState、 SaveAdapterViewState和 LoadAdapterViewState 方法。 SaveAdapterControlState、 SaveAdapterViewState、 LoadAdapterControlState,以及 LoadAdapterViewState 分别保存和加载专用控件和视图状态时调用。
对OnInit相应的Control类方法调用 、OnLoad基OnPreRender方法和OnUnload基方法。 因此,重写的任何这些 ControlAdapter 方法都必须调用其基方法;否则,不会引发与 Control 类方法关联的事件。
控件和适配器(可选)实现 IPostBackDataHandler 和 IPostBackEventHandler 接口。 .NET Framework确定适配器是否存在以及适配器是否实现这些接口。 如果这样做,适配器应根据需要重写LoadPostData和RaisePostDataChangedEventRaisePostBackEvent方法。 如果适配器中无法识别回发数据,则必须重新调用控件来处理它。 后续事件处理程序还必须对控件进行回叫。
实施者说明
从ControlAdapter类继承时,需要常规适配器功能的控件应具有相应的适配器基类,例如 TextBoxAdapter
, (模式ControlType
Adapter
) 。 适配器应至少通过其 Control 属性返回控件的强类型实例。
- 给定控件类型和标记语言的控制适配器应在模式
MarkupControlType
Adapter
(中命名,XhtmlTextBoxAdapter
例如,) 。 控件的适配器应在子名称空间中Adapters
实现。
控件适配器应继承自相应的基类,并遵循与控件相同的继承模型。 例如,从基类继承的 Control 控件的适配器应从 ControlAdapter 类或相关 ControlType
Adapter
类继承。
应在配置 .browser 文件中的所有设备节点下为专用控件定义任何专用适配器。
正确实现的控件不应假定适配器已附加,或者附加的适配器实现特定接口。 相反,它应在调用之前检查这些内容。
可以模拟控件中重写受保护的事件方法,例如 OnClick(EventArgs) 控件 LinkButton的方法。 首先,使用 OnClick
方法创建适配器类。 然后创建派生 LinkButton 自并重写 OnClick(EventArgs) 方法的新控件。 重写 OnClick(EventArgs) 的方法调用适配器的 OnClick
方法。 适配器对象通过类的Control受保护Adapter属性提供。 控件 Adapter 的属性是在 null
没有关联的适配器时,因此任何代码都应在调用适配器的方法之前检查该条件。
构造函数
ControlAdapter() |
初始化 ControlAdapter 类的新实例。 |
属性
Browser |
获取对发出当前 HTTP 请求的客户端的浏览器功能的引用。 |
Control |
获取对附加了此控件适配器的控件的引用。 |
Page |
获取对与此适配器关联的控件所驻留的页的引用。 |
PageAdapter |
获取对关联控件所驻留的页的页适配器的引用。 |