ASP.NET组件设计Step by Step(3)
自定义控件(custom control)入门
在服务器端中执行程序逻辑的组件,是asp.net 应用程序的基本构造块。为了能够在asp.net环境执行,必须满足一定条件。
为了能够参与到网页框架执行,需要满足IComponent, IDisposable, IParserAccessor, IdataBindingsAccessor等接口。所以框架提供System.Web.Control类供控件开发者继承。
IComponent
提供组件所需的基本功能,接口实现为:
{
ISite Site {get; set;}//提供站点接口,组件可以通过此接口访问容器
event EventHandler Disposed;
//事件
} 如果实现了此接口,就成为可设计组件,可加入到可视化设计器工具箱,能够脱放到页面(Isite接口)中,属性浏览器中显示属性。
IDisposable 接口实现组件自身资源释放(Icomponent实际上继承自IDisposable )
IParserAccessor 该接口规定AddParsedSubObject(object obj)方法用于通知服务器控件已分析元素(XML 或 HTML)。分析元素时,元素被识别为实现该接口的服务器控件的子级。这些元素将被转换为对象。实现该接口时,所创建的控件在被通知已分析元素后立即定义要发生的处理。
IDataBindingsAccessor 接口允许在设计时访问控件的数据绑定表达式集合。
{
DataBindingCollection DataBindings {get;}// 指示控件的所有数据绑定的集合。此属性为只读。
bool HasDataBindings {get;} //返回控件是否包含任何数据绑定逻辑。
}
继承自Control的WebControl类为表现HTML(毕竟最后用户看到的是HTML)而在Control类中加入了一些新的功能,如样式、字体、背景、前景。。。
Control类的定义:
公共属性:
ClientID 获取由 ASP.NET 生成的服务器控件标识符。
Controls 获取 ControlCollection 对象,该对象表示 UI 层次结构中指定服务器控件的子控件。
EnableViewState 获取或设置一个值,该值指示服务器控件是否向发出请求的客户端保持自己的视图状态以及它所包含的任何子控件的视图状态。
ID 获取或设置分配给服务器控件的编程标识符。
NamingContainer 获取对服务器控件的命名容器的引用,此引用创建唯一的命名空间,以区分具有相同 Control.ID 属性值的服务器控件。
Page 获取对包含服务器控件的 Page 实例的引用。
Parent 获取对页 UI 层次结构中服务器控件的父控件的引用。
Site 获取有关服务器控件所属 Web 站点的信息(原文自MSDN,但是我认为不对,应该是指组件的“容器”站点,并非 web site)。
TemplateSourceDirectory 获取包含当前服务器控件的 Page 或 UserControl 的虚拟目录。
UniqueID 获取服务器控件的唯一的、以分层形式限定的标识符。
Visible 获取或设置一个值,该值指示服务器控件是否作为 UI 呈现在页上。
公共方法
DataBind 将数据源绑定到被调用的服务器控件及其所有子控件。
Dispose 使服务器控件得以在从内存中释放之前执行最后的清理操作。
Equals(从 Object 继承) 已重载。确定两个 Object 实例是否相等。
FindControl 已重载。在当前的命名容器中搜索指定的服务器控件。
GetHashCode(从 Object 继承) 用作特定类型的哈希函数,适合在哈希算法和数据结构(如哈希表)中使用。
GetType(从 Object 继承) 获取当前实例的 Type。
HasControls 确定服务器控件是否包含任何子控件。
RenderControl 将服务器控件的内容输出到所提供的 HtmlTextWriter 对象中;如果已启用跟踪功能,则存储有关控件的跟踪信息。
ResolveUrl 根据传递给 TemplateSourceDirectory 属性的值,将相对 URL 解析为绝对 URL。
ToString(从 Object 继承) 返回表示当前 Object 的 String。
公共事件
DataBinding 当服务器控件绑定到数据源时发生。
Disposed 当从内存释放服务器控件时发生,这是请求 ASP.NET 页时服务器控件生存期的最后阶段。
Init 当服务器控件初始化时发生;初始化是控件生存期的第一步。服务器控件应执行任何创建和设置实例所需的初始化步骤。在该事件内无法使用视图状态信息;它尚未填充。在该事件的生存期内不应访问其他服务器控件,不论它是此控件的子级还是父级。不一定会创建其他服务器控件,也不一定能够访问它们。
Load 当服务器控件加载到 Page 对象中时发生。通知服务器控件执行任何设置为在每次页请求时发生的处理步骤。开发者可以访问视图状态信息并利用该事件形成 POST 数据。还可以访问页控件层次结构内的其他服务器控件。
PreRender 当服务器控件将要呈现给其包含的 Page 对象时发生。使用该事件在服务器控件呈现给页的输出之前执行任何更新。在该事件的生存期内可以保存服务器控件视图状态的任何更改。不保存呈现阶段内所做的同样更改。
Unload 当服务器控件从内存中卸载时发生。
受保护的属性和方法有:
保护的属性
ChildControlsCreated 获取一个值,该值指示是否已创建服务器控件的子控件。
Context 为当前 Web 请求获取与服务器控件关联的 HttpContext 对象。
Events 获取控件的事件处理程序委托列表。此属性为只读。
HasChildViewState 获取一个值,该值指示当前服务器控件的子控件是否具有任何已保存的视图状态设置。
IsTrackingViewState 获取一个值,该值指示服务器控件是否将更改保存到其视图状态。
ViewState 获取状态信息的字典,这些信息使您可以在同一页的多个请求间保存和还原服务器控件的视图状态。
ViewStateIgnoresCase 获取一个值,该值指示 StateBag 对象是否不区分大小写。
受保护的方法
AddParsedSubObject 通知服务器控件某个元素(XML 或 HTML)已经过语法分析,并将该元素添加到服务器控件的 ControlCollection 对象。
ClearChildViewState 删除服务器控件的所有子控件的视图状态信息。
CreateChildControls 通知使用基于合成的实现的服务器控件创建它们包含的任何子控件,以便为回发或呈现做准备。
CreateControlCollection 创建一个新的 ControlCollection 对象来保存服务器控件的子控件(包括文本控件和服务器控件)。
EnsureChildControls 确定服务器控件是否包含子控件。如果不包含,则创建子控件。
Finalize(从 Object 继承) 已重写。允许 Object 在“垃圾回收”回收 Object 之前尝试释放资源并执行其他清理操作。
IsLiteralContent 确定服务器控件是否只包含文字内容。Asp.net页面中普通的html标签被asp.net编译为一个 LiteralContent控件(意味着轻型控件)。
LoadViewState 从 SaveViewState 方法保存的上一个页请求还原视图状态信息。
MapPathSecure 如果请求服务器控件有足够的安全权限读取映射结果,检索相对于源文件的映射物理文件路径。
MemberwiseClone(从 Object 继承) 创建当前 Object 的浅表副本。
OnBubbleEvent 确定服务器控件的事件是否沿页的 UI 服务器控件层次结构向上传递。
OnDataBinding 引发 DataBinding 事件。
OnInit 引发 Init 事件。
OnLoad 引发 Load 事件。
OnPreRender 引发 PreRender 事件。
OnUnload 引发 Unload 事件。 注意 在服务器控件生存期的此阶段,服务器控件应执行所有最后的清理操作,例如关闭文件、关闭数据库连接和丢弃对象。
RaiseBubbleEvent 将所有事件源及其信息分配给控件的父级。
Render 将服务器控件内容发送到提供的 HtmlTextWriter 对象,此对象编写将在客户端呈现的内容。
RenderChildren 将服务器控件子级的内容输出到提供的 HtmlTextWriter 对象,此对象编写将在客户端呈现的内容。
SaveViewState 保存自页回发到服务器后发生的任何服务器控件视图状态更改。
TrackViewState 导致跟踪服务器控件的视图状态的更改,以便这些更改可以存储到服务器控件的 StateBag 对象中。通过 Control.ViewState 属性可访问此对象。
了解了Control这个“基石”,我们可以了解到,编写服务器组件就是在此基石上建造,同时我们可以调用的方法、数据,可以截获的事件都列出,以上数据成员是我们编写服务器控件的“输入数据”(当然还可以有其他输入数据,但是主要数据在此);以上方法是帮助我们操控控件以及控件同外部交互,事件为我们“感知”外部交互提供时机;另外,服务器控件也需要被容器调用相关方法(譬如render),我们可以重写这些方法,修改Control的缺省GUI表现。