此演练演示如何创建和编译自定义 ASP.NET 服务器控件以及如何在页中使用该控件。
通过此演练,您将学会如何执行以下任务:
-
创建一个 ASP.NET 服务器控件。
-
向该控件及其成员添加元数据以控制安全性和设计时行为。
-
使用 ASP.NET 网站中的 App_Code 目录对控件进行测试(无需手动编译步骤)。
-
在配置文件和该控件的程序集中指定一个标记前缀。
-
将该控件编译为一个程序集并将其添加到 Bin 目录中。
-
将一个位图嵌入到该控件的程序集中,以作为可视化设计器的工具箱图标使用。
-
在页中使用已编译的控件。
可视化设计工具(如 Microsoft Visual Studio 2005)可以简化控件的开发过程,但并不是创建或生成自定义控件的必不可少的工具。可以通过使用任何文件编辑器创建控件,并使用 .NET Framework SDK 附带的编译器从命令行生成这些控件。无论以何种方式创建控件,在可视化设计器中控件的设计时外观和行为都将相同。页开发人员可将控件添加到可视化设计器的工具箱,可将其拖动到设计图面上,还可以在属性浏览器中访问其属性和事件。在有些可视化设计器(如 Visual Studio 2005)中,自定义控件还可自行支持 IntelliSense。
要创建的控件 WelcomeLabel 是一个简单控件,与标准的 控件类似。WelcomeLabel 类从 派生,它定义了一个 Text 属性,该属性允许页开发人员提供一个文本字符串,以欢迎访问站点的用户。如果用户名出现在用户浏览器发送的标题中,WelcomeLabel 就会将用户名追加到该文本字符串。有关检索用户名的更多信息,请参见 。例如,如果页开发人员将“Hello”设置为 Text 属性的值,则根据标题中是否出现用户名,WelcomeLabel 将呈现“Hello, userName!”或“Hello!”。
创建自定义服务器控件的代码
-
创建一个名为 WelcomeLabel.cs 或 WelcomeLabel.vb 的文件。
-
将以下代码添加到控件的源文件中:
}
}
}
代码讨论
下面的代码讨论并不是执行此演练中的步骤必不可少的内容,可以在开始时跳过。但是,如果您初学控件创作,我们建议您至少要在完成演练后阅读此内容。
如果控件要呈现用户界面 (UI) 元素或任何其他客户端可见的元素,则应从 System.Web.UI.WebControls.WebControl(或派生类)派生该控件。如果控件要呈现在客户端浏览器中不可见的元素(如隐藏元素或 meta 元素),则应从 派生该控件。WebControl 类从 Control 派生,并添加了与样式相关的属性,如 、 和 。此外,一个从 WebControl 派生的控件也自行参与到 ASP.NET 的主题功能。
如果您的控件要扩展现有控件(如 、Label 或 控件)的功能,则可以从该控件派生。由于 WelcomeLabel 扩展了 Label 控件的功能,因此它可从 Label 派生。但是,本演练从 WebControl 派生 WelcomeLabel 以演示如何定义属性和定义属性元数据。
WelcomeLabel 定义一个 Text 属性,并使用视图状态存储该属性值。使用视图状态保存回发间的 Text 值。每次回发时,将重新创建页并从视图状态还原值。如果 Text 值并未存储在视图状态中,则在每次回发时会将值设置为其默认的 。 属性继承自 WebControl,是保存数据值的字典。通过使用 键,可输入和检索值。本例中将“Text”用作键。字典中的项被类型化为 ,然后必须将其强制转换为属性类型。有关更多信息,请参见 。
WelcomeLabel 控件通过重写继承的 方法呈现其 Text 属性。传入 RenderContents 方法的参数是 类型的对象,是具有呈现标记和其他 HTML(和 HTML 变量)标记的方法的实用工具类。
注意,WelcomeLabel 会连续调用 HtmlTextWriter 对象的 方法,而不是先执行字符串串联然后调用 Write 方法。由于 HtmlTextWriter 对象直接写入输出流,因此这样可以提高性能。字符串串联需要时间和内存来创建字符串,然后写入流。在控件中实现呈现时,应按照本演练中说明的模式进行操作。
|
|
|---|
|
通常,在从 WebControl 派生控件并呈现单个元素时,应重写 RenderContents 方法(而不是 方法),以呈现控件标记中的内容。在呈现控件及其样式属性的开始标记之后,WebControl 的 Render 方法将调用 RenderContents。如果重写 Render 方法以写入内容,则控件将丢失生成到 WebControl 的 Render 方法中的样式呈现逻辑。有关呈现从 WebControl 派生的控件的更多信息,请参见 Web 控件呈现示例。 |
应用于 WelcomeLabel 的属性包含由公共语言运行库和设计时工具使用的元数据。
在类级别上,通过以下属性标记 WelcomeLabel :
-
是代码访问安全属性。该属性使 JIT 编译器检查链接到
WelcomeLabel的代码是否具有 权限。所有的公共 ASP.NET 类均使用此属性标记。应将 AspNetHostingPermissionAttribute 应用于控件,以对部分受信任的被调用方进行安全检查。 -
是设计时属性 (Attribute),它指定控件的默认属性 (Property)。在可视化设计器中,当页开发人员在设计图面上单击控件时,属性浏览器通常突出显示此默认属性。
-
指定元素的格式字符串。如果在工具箱中双击控件或将其从工具箱拖动到设计图面上时,该字符串将成为控件的标记。对于
WelcomeLabel,该字符串创建此元素:<aspSample:WelcomeLabel runat="server"> </aspSample:WelcomeLabel>
WelcomeLabel 控件还从 WebControl 基类继承了两个属性: 和 。它们被应用为 ParseChildren(true) 和 PersistChildren(false)。这两个属性 (Attribute) 一起与 ToolboxDataAttribute 属性 (Attribute) 共同使用,这样可将子元素解释为属性 (Property),并将属性 (Property) 作为属性 (Attribute) 保留。
以下应用于 WelcomeLabel 的 Text 属性 (Property) 的属性 (Attribute) 是标准设计时属性 (Attribute),通常会将标准设计时属性 (Attribute) 应用于控件的所有公共属性 (Property):
-
(被指定为 true 或 false),指定将属性绑定到数据对可视化设计器是否有意义。例如,在 Visual Studio 2005 中,如果属性标记为
Bindable(true),则该属性可显示在“数据绑定”对话框中。如果属性 (Property) 没有使用此属性 (Attribute) 标记,则属性 (Property) 浏览器会推断其值为Bindable(false)。 -
指定如何在可视化设计器的属性浏览器中对属性进行分类。例如,当页开发人员使用属性浏览器的分类视图时,
Category("Appearance")将告知属性浏览器在“外观”类别中显示属性。可以根据属性浏览器中的现有类别指定字符串参数,也可以创建自己的类别。 -
指定属性的简短描述。在 Visual Studio 2005 中,属性浏览器将在“属性”窗口底部显示选定的属性的描述。
-
指定属性的默认值。此值应与从属性访问器 (getter) 返回的默认值相同。在 Visual Studio 2005 中,DefaultValueAttribute 允许页开发人员通过在“属性”窗口中唤出快捷菜单然后单击“重置”按钮将属性值重置为其默认值。
-
(指定为 true 或 false)指定本地化属性对可视化设计器是否有意义。当某属性标记为
Localizable(true)时,可视化设计器会在对本地化资源进行序列化时包含该属性。对控件轮询可本地化的属性时,设计器会将此属性值保存到非特定于区域性的资源文件或其他本地化源中。注意
由于 ASP.NET 1.0 版和 1.1 版中的 ASP.NET 本地化模型不同,因此在这些版本中不能将 LocalizableAttribute 应用于自定义服务器控件。
应用于控件及其成员的设计时属性在运行时不会影响控件的功能,但在可视化设计器中使用控件时,这些属性能提升开发人员的体验。有关服务器控件的设计时、分析时和运行时属性的完整列表,可参见自定义服务器控件的元数据属性。