日期:2010-09-16  浏览次数:20470 次

  在前面的系列文章中,笔者已经列举了几个实现自定义服务器控件的示例。通过这些示例,读者初步接触了有关创建服务器控件属性的内容。例如,使用私有变量、视图状态、控件状态等实现属性等等。虽然读者通过这些内容可以了解实现属性的一些基本知识,但是这还是不够的。从本节开始,将针对实现自定义服务器控件属性的问题展开讲解。本节重点介绍实现自定义服务器控件属性的一些基本概念和简单属性的基本实现方法等内容。

  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就是典型的内部嵌套形式默认属性。

  2) 从Control和WebControl继承的属性

  如前面文章所述,如果需要开发没有UI的控件或者组合其他呈现它们自己的UI的控件,则从System.Web.UI.Control基类派生。为此,读者应该了解一些Control类的常见属性。如表1列举了Control基类常用属性,它们在开发服务器控件过程中经常被使用。

属性数据类型说明
ControlsControlCollection获取 ControlCollection 对象,该对象表示 UI 层次结构中指定服务器控件的子控件
AdapterControlAdapter获取控件的浏览器特定适配器。(asp.net 2.0新增)
AppRelativeTemplateSourceDirectorystring获取或设置包含该控件的 Page 或 UserControl 对象的应用程序相对虚拟目录。(asp.net 2.0新增)
EnableThemingbool获取或设置一个值,该值指示是否对此控件应用主题。(asp.net 2.0新增)
PagePage获取对包含服务器控件的 Page 实例的引用。
ParentControl控件属于其Controls集合的控件。(如果控件B是A.Controls的一个元素,则控件A是控件B的父级)
EnableViewStateBool 指示控件在往返过程中是否维护其视图状态。如果父控件不维护其视图状态,则自动不维护其子控件的视图状态
TemplateControl TemplateControl获取或设置对包含该控件的模板的引用。(asp.net 2.0新增)
UniqueIDString页框架给控件分配的分层限定的唯一标识符
ClientIDString 给控件分配的唯一标识符,该唯一标识符在客户端上呈现为HTML ID特性。ClientID与UniqueID是不同的,这是因为UniqueID可以包含冒号字符(:),而在HTML ID特性中该字符无效(并且不允许在客户端脚本的变量名中使用)

  页框架

  如前面文章所述,如果创建具有UI的自定义服务器控件,则应该从WebControl或System.Web.UI.WebControls中的任何控