18.2 元数据特性
简单地讲,元数据特性应用于服务器控件及其成员,从而提供由设计工具、ASP.NET页分析器、ASP.NET运行时以及公共语言运行时使用的信息。使用示例如下面的代码所示:
[AspNetHostingPermission(SecurityAction.Demand,
Level=AspNetHostingPermissionLevel.Minimal),
AspNetHostingPermission(SecurityAction.InheritanceDemand,
Level=AspNetHostingPermissionLevel.Minimal),
ToolboxData("<{0}:IndexButton runat=\"server\">
</{0}:IndexButton>")]
public class IndexButton:Button
{
}
当页开发人员在可视化设计器中使用控件时,设计时特性能改进开发人员的设计时体验。仅用于设计时的特性在页请求期间对控件的功能没有任何影响。控件的分析时特性由ASP.NET页分析器在其读取页中控件的声明性语法时使用。分析时特性和运行时特性是保证控件在页中正常工作必不可少的内容。
18.2.1 应用于控件的特性
在ASP.NET中,应用于控件的特性有如下12类:
1)AspNetHostingPermissionAttribute。JIT编译时代码访问安全特性。一般情况下,你需要使用此属性来确保链接到控件的代码具有适当的安全权限。Control类带有两个JIT编译时代码访问安全特性标记,如下所示:
AspNetHostingPermission(SecurityAction.Demand,
Level=AspNetHostingPermissionLevel.Minima)
与
AspNetHostingPermission(SecurityAction.InheritanceDemand,
Level=AspNetHostingPermissionLevel.Minimal)
通常,应将第一个特性应用于控件,但并非必须应用第二个特性,因为继承请求是可传递的,在派生类中仍有效。
2)ControlBuilderAttribute。分析时特性,它将自定义控件生成器与控件关联。一般情况下,只有在希望使用自定义控件生成器,对页分析器用于分析控件的声明性语法的默认逻辑进行修改时,才需要应用此特性。使用示例如下面的代码所示:
[ControlBuilder(typeof(MyControlBuilder))]
3)ControlValuePropertyAttribute。设计时和运行时特性,指定用做控件的默认值的属性。应用此特性可让一个控件在运行时用做查询中的参数,并可定义ControlParameter对象在运行时绑定到的默认值。使用示例如下面的代码所示:
[ControlValueProperty("Text")]
4)DefaultEventAttribute。设计时特性,在可视化设计器中指定控件的默认事件。在许多可视化设计器中,页开发人员在设计图面上双击控件时,将打开代码编辑器,同时将光标定位到默认事件的事件处理程序中。使用示例如下面的代码所示:
[DefaultEvent("Submit")]
5)DefaultPropertyAttribute。设计时特性。当页开发人员在设计图面上选择控件时,此特性中指定的属性将在可视化设计器的属性浏览器中突出显示。使用示例如下面的代码所示:
[DefaultProperty("Text")]
6)DesignerAttribute。设计时特性,指定与控件关联的设计器类。控件设计器类控制关联的控件在可视化设计器的设计图面上的外观和行为。使用示例如下面的代码所示:
[Designer(typeof(SimpleCompositeControlDesigner))]
7)ParseChildrenAttribute。分析时特性,指定控件标记中的内容是否与属性或子控件对应。其中,Control类被标记为ParseChildren(false),表示页分析器将控件标记中的内容解释为子控件;WebControl类被标记为ParseChildren(true),表示页分析器将控件标记中的内容解释为属性。只有在希望对在WebControl类的ParseChildrenAttribute特性中指定的逻辑进行修改时,才需要应用此特性。使用示例如下面的代码所示:
[ParseChildren(true,"Contacts")]
8)PersistChildrenAttribute。设计时特性,指定当以声明方式在页中使用控件时,可视化设计器是否应该在控件的标记中保存子控件或属性。Control类被标记为PersistChildren(true),表示设计器在控件标记中保留子控件;WebControl类被标记为PersistChildren(false),表示设计器在控件标记中将属性保存为特性。使用示例如下面的代码所示:
[PersistChildren(false)]
9)ThemeableAttribute。分析时特性,指定控件是否受主题或控件外观的影响。如果标记某一控件类型以指示不能向其应用主题,则该控件的所有成员同样也不受主题的影响。使用示例如下面的代码所示:
[Themeable(false)]
10)ToolboxDataAttribute。设计时特性,指定从工具箱创建控件时可视化设计器为标记创建的标记格式。使用示例如下面的代码所示:
ToolboxData("<{0}:MyBook runat=\"server\"></{0}:MyBook>")
11)ToolboxItemAttribute。设计时特性,指定可视化设计器应在工具箱中显示控件还是组件。默认情况下,始终在工具箱中显示控件。此属性只能应用于不希望在工具箱中显示的控件(如模板属性的所有者)。使用示例如下面的代码所示:
[ToolboxItem(false)]
12)ValidationPropertyAttribute。设计时特性,指定由验证控件检查的属性的名称。通常这些属性的值由用户在运行时提供,如TextBox控件的Text属性。在可视化设计器中,允许页开发人员选择验证控件目标的对话框会列出通过页上控件中的ValidationPropertyAttribute指定的各个属性。使用示例如下面的代码所示:
[ValidationProperty("Text")]
18.2.2 应用于公共属性的特性
在ASP.NET中,应用于公共属性的特性有如下17类:
1)BindableAttribute。设计时特性,指定将数据绑定到属性是否有意义。在可视化设计器中,属性浏览器可以在对话框中显示控件的可绑定属性。在控件中,如果属性没有使用此特性标记,则属性浏览器会推断其值为Bindable(false),否则应该标记为[Bindable(true)]。
2)BrowsableAttribute。设计时特性,指定是否应在可视化设计器的属性浏览器中显示某个属性。将Browsable(false)应用于不希望在属性浏览器中显示的属性。没有通过此特性标记某个属性时,属性浏览器会推断其默认值为Browsable(true)。
3)CategoryAttribute。设计时特性,指定如何在可视化设计器的属性浏览器中对属性进行分类。例如,当页开发人员在属性浏览器中使用分类视图时,Category("Appearance")将告知属性浏览器在“外观”类别中显示属性。可以指定一个对应于属性浏览器中的现有类别的字符串参数,也可以创建自己的类别。
4)DefaultValueAttribute。设计时特性,指定属性的默认值,如[DefaultValue("")]。此值应与从属性访问器返回的默认值相同。在有些可视化设计器中,DefaultValueAttribute特性允许页开发人员使用快捷菜单上的“重置”命令将属性值重置为其默认值。
5)DescriptionAttribute。设计时特性,指定属性的简短描述。在可视化设计器中,属性浏览器通常在窗口底部显示选定的属性的描述。使用示例如下面的代码所示:
[Description("The welcome message text.")]
6)DesignerSerializationVisibilityAttribute。设计时特性,指定是否对设计时设置的属性或其内容(如子属性或集合项)进行序列化。该特性的构造函数的参数是一个Designer SerializationVisibility枚举值。未应用此特性且属性的值已序列化时,则暗示使用默认值Visible。使用示例如下面的代码所示:
[DesignerSerializationVisibility
((DsignerSerializationVisibility.Content)]
7)EditorAttribute。设计时特性,将自定义UITypeEditor编辑器与某个属性或属性类型关联。如果已将此特性应用于该类型,则不必将其应用于该类型的属性。使用示例如下面的代码所示:
[Editor(typeof(ContactCollectionEditor),typeof(UITypeEditor))]
8)EditorBrowsableAttribute。设计时特性,指定属性名称是否显示在源编辑器的IntelliSense列表中。当然,也可将此特性应用于方法和事件。此特性的构造函数的参数是一个EditorBrowsable State枚举值。未应用此特性时,则暗示使用默认值Always。使用示例如下面的代码所示:
[EditorBrowsableAttribute(EditorBrowsableState.Never)]
9)FilterableAttribute。设计时和分析时特性,指定某个属性是否能参与设备和浏览器筛选。页开发人员利用筛选能在一个控件声明中为不同的浏览器指定不同的属性值。例如,页开发人员可以使用筛选为Label控件的Text属性设置不同的值。其语法如下所示:
<asp:Label UP:Text="Hello"and IE:Text="Welcome to my site"
runat="server"/>
其中,UP和IE是浏览器筛选器。未应用此特性时,则暗示使用默认值Filterable(true)。
10)LocalizableAttribute。设计时特性,指定对属性进行本地化是否有意义。如果一个属性标记为Localizable(true),则对应的属性值存储在资源文件中。未应用此特性时,则暗示使用默认值Localizable(false)。
11)NotifyParentPropertyAttribute。设计时特性,指定在属性浏览器中对子属性所做的更改应传播到父属性。使用示例如下面的代码所示:
[NotifyParentProperty(true)]
12)PersistenceModeAttribute。设计时特性,指定是将属性保存为控件标记上的特性,还是将其保存为控件标记中的嵌套内容。此特性的构造函数的参数是一个PersistenceMode枚举值。使用示例如下面的代码所示:
[PersistenceMode(PersistenceMode.InnerProperty)]
13)TemplateContainerAttribute。设计时和分析时特性,为返回ITemplate接口的属性指定命名容器类型。使用示例如下面的代码所示:
[TemplateContainer(typeof(CustomTemplateContainer))]
14)TemplateInstanceAttribute。设计时和分析时特性,指定模板属性允许创建单个实例还是多个实例。如果未使用该特性扩展模板属性,则默认情况下允许创建多个实例。使用示例如下面的代码所示:
[TemplateInstance(TemplateInstance.Single)]
15)ThemeableAttribute。分析时特性,指定控件成员是否可以受主题或控件外观的影响。默认情况下,如果控件类型本身可应用主题,则该控件公开的所有属性都可以应用主题。使用示例如下面的代码所示:
[Themeable(false)]
16)TypeConverterAttribute。设计时、分析时和运行时特性,将类型转换器与某个属性或属性类型关联。类型转换器执行从字符串表示形式到指定类型(或相反)的转换。使用示例如下面的代码所示:
[TypeConverter(typeof(AuthorConverter))]
17)UrlPropertyAttribute。设计时和运行时特性,指定一个字符串属性表示一个URL值,利用此值可以将URL生成器与该属性关联起来。使用示例如下面的代码所示:
[UrlProperty("*.aspx",AllowedTypes=UrlTypes.Absolute
|UrlTypes.RootRelative|UrlTypes.AppRelative)]
18.2.3 应用于事件成员的特性
应用于事件成员的特性主要包括三个设计时特性,即BrowsableAttribute、CategoryAttribute和DescriptionAttribute。当然,这些特性还应用于公共属性的特性。在前面已经对这些特性进行了阐述,这里就不再重复阐述。