在前面的系列文章中,笔者已经列举了几个实现自定义服务器控件的示例。通过这些示例,读者初步接触了有关创建服务器控件属性的内容。例如,使用私有变量、视图状态、控件状态等实现属性等等。虽然读者通过这些内容可以了解实现属性的一些基本知识,但是这还是不够的。从本节开始,将针对实现自定义服务器控件属性的问题展开讲解。本节重点介绍实现自定义服务器控件属性的一些基本概念和简单属性的基本实现方法等内容。
1. 控件属性基本概念
本小节介绍有关创建服务器控件属性的基本内容,具体内容包括:(1)属性类型和形式;(2)从Control和WebControl继承的属性;(3)与属性相关的设计时元数据attribute。
1) 属性类型和形式
通常情况下,服务器控件属性可以分为两种类型:简单属性和复杂属性。
简单属性是指属性值可以很容易转换为字符串表达式的属性,这种属性的值通常为Boolean、Byte、Char、Double、Enum、Int32、DateTime等简单数值类型,以及String类型和枚举类型。开发人员可以通过添加代码,将简单属性存储在ViewState字典中,以在回发间进行状态管理。如果一个属性的类型是本身具有属性(称为子属性)的类,则该属性就称为复杂属性。例如,WebControl类的Font属性的类型是本身具有属性(如Bold和Name)的FontInfo类。Bold和Name是WebControl的Font属性的子属性。ASP.NET页框架可通过使用带有连字符的语法(例如Font-Bold="true")在控件的开始标记上保存子属性,但如果在控件的标记(例如<font Bold="true">)中保存子属性,则子属性在页中的可读性更强。
在上文中谈到了属性的标记形式,即添加连字符的形式。实际上,不同的属性表现出不同的标记形式。为了加深对简单属性和复杂属性的认识,下面介绍一下有关属性的4种标记形式。
· 通用形式属性
这是一种最为常见的属性标记形式。这种形式的属性标记位于控件内部,与runat="server"一起定义。通常为以下形式:
<MyControl:CustomerControl id="demo1" runat="server" PropertyName="PropertyValue"/> |
其中PropertyName为一个不带连字符的单词。例如:
<asp:Button id="button1" runat="server" Text="Submit"/> |
此处的属性Text属于通用形式属性。
· 连字符形式属性
这种标记形式的属性位于控件标记内部,带有连字符是这种形式属性的最大特征。其形式为:
<MyControl:CustomerControl id="demo1" runat="server" Sub-PropertyName="PropertyValue"/> |
其中Sub-PropertyName为一个带连字符的单词组合。例如:
<asp:Label id="label1" runat="server" Font-Size="Medium" Font-Underline="True" /> |
在上面的代码中,Font-Size和Font-Underline就是典型的连字符形式属性。
· 内部嵌套形式属性
凡是具有这种标记形式的属性均为复杂属性。它是以嵌套形式在控件标记内部声明某属性集的子属性。其形式类似:
<asp:DataGrid id="DataGrid1" runat="server"> <HeaderStyle ForeColor="#FFFFCC" BackColor="#990000"> </HeaderStyle> <FooterStyle ForeColor="#330099" BackColor="#FFFFCC"> </FooterStyle> </asp:DataGrid> |
其中HeaderStyle是内部嵌套形式属性,ForeColor和BackColor是HeaderStyle属性的子属性。FooterStyle与HeaderStyle是一样的,也是内部嵌套形式属性。
· 内部嵌套形式默认属性
这种标记形式的属性通常用于服务器控件的集合属性,具有这种形式的属性必然是复杂属性。该形式属性与上文所述"内部嵌套形式属性"的标记形式基本相同。不同之处在于:当某控件具有这种属性时,控件标记中只包含该形式属性,不能包含其他任何属性。这就是为什么称为"默认"的原因。其形式类似:
<asp:DropDownList id="DropDownList1" runat="server"> <asp:ListItem>1</asp:ListItem> <asp:ListItem>2</asp:ListItem> <asp:ListItem>3</asp:ListItem> <asp:ListItem>4</asp:ListItem> </asp:DropDownList> |
其中属性ListItem就是典型的内部嵌套形式默认属性。