使用模板化控件,页面开发者可以通过模板(template)来指定生成的全部或部分UI.模板是页面语法中的一部分,可以包括带有静态HTML以及其他文字文本的服务器控件.模板化控件提供了重要的自定义能力,通常被称做无外观控件(lookless controls),因为它们并没有生成预先确定的用户界面.
理解样式和模板之间的差别是很重要的,它们是控件为页面开发者提供的用来定制生成的UI的两种不同的机制.使用样式,页面开发者可以定制生成的UI的可视化外观,而模板可以使页面开发者自定义所生成的UI的内容.例如,页面开发者可以使用样式来修改控件可能提供的文本的BackColor(背景色)和ForeColor(前景色)属性.而使用模板,页面开发者告诉控件应该生成什么元素:复选框、表格或一些其他内容.
这里假设读者熟悉标准ASP.NET模板化控件,例如Repeater和DataList,下面主要讲解如何实现一个模块化控件.模块化控件的主要功能是通过System.Web.UI.ITemplate类型的一个或多个属性来表示的.用户通常是通过用声明性的语法来指定某个模板属性的,就像接下来的例子中所示的那样,该例子指定DataList控件的ItemTemplate属性.
<asp:DataList runat="server">
<ItemTemplate>
<asp:Label id="label" runat="server"
Text='<%# Container.DataItem %>' />
<asp:button button="button" runat="server"
id="selectButton" CommandName="Select"
Text="Select" ForeColor="Blue"/>
</ItemTemplate>
</asp:DataList>
页面解析器解析模板标签内的文本,并生成一个解析树来表示模板的内容,就像解析整个页面时一样.解析器用解析树(由于System.Web.UI.ControlBuilder对象组成)来创建ITemplate类型的一个实例子.该ITemplate实例可以在给定的容器控件中创建表示模板内容的控件层次.下面是ITemplate接口的定义:
public interface ITemplate {
//Iteratively populates a provided control
//with a subhierarchy of child controls
//represented by the template.
void InstantiateIn(control container);
}
解析器把该ITemplate实例赋值给控件相应的ITemplate属性.当构造控件层次时,控件可以多次调用模板的InstantiateIn方法.每次调用InstantiateIn方法时,模板创建由模板的内容表示的控件数的一个副本。可以通过手工实现ITemplate接口.