在控件程序集中嵌入图标
创建或获取一个 16*16 像素的位图,将其作为控件的工具箱图标。
将该位图命名为 WelcomeLabel.bmp。
将该位图文件添加到包含 WelcomeLabel 控件源文件的目录(CustomControlsCS 或 CustomControlsVB)中。
从包含源文件的目录中运行以下命令:
C#
复制代码
csc /res:WelcomeLabel.bmp,Samples.ASPNet.CS.Controls.WelcomeLabel.bmp /t:library /out:Samples.ASPNet.CS.Controls.dll /r:System.dll /r:System.Web.dll *.cs
Visual Basic
复制代码
vbc /res:WelcomeLabel.bmp,Samples.ASPNet.VB.Controls.WelcomeLabel.bmp /t:library /out:Samples.ASPNet.VB.Controls.dll /r:System.dll /r:System.Web.dll *.vb
此命令将编译控件并将该位图作为资源嵌入到程序集中。嵌入的位图资源的名称必须与关联控件的命名空间限定名称完全相同。例如,如果控件名称为 Samples.ASPNet.CS.Controls.WelcomeLabel,则嵌入的位图的名称必须为 Samples.ASPNet.CS.Controls.WelcomeLabel.bmp。此命名约定使可视化设计器能自动将该位图用作控件的工具箱图标。如果不使用此命名约定,则必须将 ToolboxBitmapAttribute 应用于该控件,以指定嵌入的位图资源的名称。
使用 TagPrefixAttribute 提供标记前缀/命名空间映射
在本演练前面的内容中,在介绍使用 App_Code 目录时讲述了页开发人员如何在页或 Web.config 文件中指定标记前缀。可以选择通过包含程序集级别的 System.Web.UI.TagPrefixAttribute 属性,建议可视化设计器应为控件使用的默认标记前缀。如果设计器未找到在 Web.config 文件或页中的 Register 指令中映射的标记前缀,TagPrefixAttribute 属性就会为可视化设计器提供可以使用的标记前缀,因此该属性非常有用。在工具箱中首次双击控件或将其从工具箱拖动到页中时,此标记前缀将向页进行注册。
如果决定使用 TagPrefixAttribute 属性,则可以在与控件一起编译的单独文件中指定该属性。根据约定,该文件名为 AssemblyInfo.languageExtension,如 AssemblyInfo.cs 或 AssembyInfo.vb。下面的过程介绍如何指定 TagPrefixAttribute 元数据。
注意
如果没有在控件的程序集中指定 TagPrefixAttribute,并且页开发人员没有在页或 Web.config 文件中指定标记前缀/命名空间映射,则可视化设计器将创建一个默认的标记前缀。例如,从工具箱中拖动控件时,Visual Studio 2005 将创建其自己的控件标记,如 cc1。
使用 TagPrefixAttribute 添加命名空间/标记前缀映射
在源代码目录中创建一个名为 AssemblyInfo.cs 或 AssemblyInfo.vb 的文件并向该文件添加以下代码。
C#
复制代码
using System;using System.Web.UI;[assembly: TagPrefix("Samples.ASPNet.CS.Controls", "ASPSample")]
Visual Basic
复制代码
Imports SystemImports System.Web.UI
标记前缀属性在命名空间 Samples.ASPNet.CS.Controls 或 Samples.ASPNet.VB.Controls 与前缀 ASPSample 之间创建映射。
使用前面使用的编译命令重新编译所有的源文件(使用或不使用嵌入资源)。
在 ASP.NET 页中使用已编译的自定义控件
若要测试自定义控件的已编译版本,则必须使网站中的页可以访问此控件的程序集。
使网站可以访问控件的程序集
在网站的根目录下创建一个 Bin 目录。
将控件程序集(Samples.ASPNet.CS.Controls.dll 或 Samples.ASPNet.VB.Controls.dll)复制到 Bin 目录。
从 App_Code 目录中删除该控件的源文件。
如果没有删除源文件,则您的控件的类型将同时存在于编译的程序集中和由 ASP.NET 动态生成的程序集中。这在加载该控件时会造成不明确引用,加载任何使用该控件的页时将生成编译器错误。
本演练中创建的程序集必须放在 ASP.NET 网站的 Bin 目录中才能使网站中的页使用您的控件,故而该程序集为私有程序集。如果其他应用程序没有安装该程序集的副本,则这些应用程序都不能访问该程序集。如果要为共享的 Web 宿主应用程序创建控件,通常会将控件打包到一个私有程序集中。但是,如果要创建在专用宿主环境中使用的控件,或要创建 ISP 向所有客户提供的一系列控件,则需要将您的控件打包到安装在全局程序集缓存中的一个共享(强名称)程序集中。有关更多信息,请参见使用程序集和全局程序集缓存。
接下来,必须修改在 Web.config 中创建的标记前缀映射,以指定控件的程序集名称。
修改 Web.config 中的标记前缀映射
编辑 Web.config 文件,向 addtagPrefix 元素添加 assembly 属性:
C#
复制代码
Visual Basic
复制代码
assembly 属性指定控件所在的程序集的名称。addtagPrefix 元素将标记前缀映射到命名空间和程序集的组合。ASP.NET 从 App_Code 目录中的源文件动态生成程序集时,无需提供程序集属性。未使用程序集属性时,ASP.NET 会从通过 App_Code 目录动态生成的程序集加载控件的类型。
查看使用自定义控件的页
通过在地址栏中输入以下 URL,可在浏览器中显示 WelcomeLabelTest.ASPx 页:
http://localhost/ServerControlsTest/WelcomeLabelTest.ASPx
如果在可视化设计器(如 Visual Studio 2005)中使用您的控件,可以向工具箱添加您的控件,可以将其从工具箱拖动到设计图面,还可以在属性浏览器中访问其属性和事件。此外,在 Visual Studio 2005 中,您的控件在页设计器的“源”视图和代码编辑器中具有完整的 IntelliSense 支持。这包括 script 块中的语句结束支持以及页开发人员单击控件标记时的属性浏览器支持。
注意
在许多可视化设计器中,可以将自定义控件添加到设计器的工具箱中。有关详细信息,请参阅设计器文档。
后续步骤
本演练演示了如何开发简单的自定义 ASP.NET 服务器控件以及如何在页中使用该控件。您了解了如何定义属性以及如何将控件编译为程序集。有关更多信息,包括有关呈现、定义属性、维护状态和实现复合控件的信息,请参见开发自定义 ASP.NET 服务器控件。
在本演练中,您了解了可以为您的控件提供自定义工具箱图标。您还学习了如何添加设计时元数据,从而为您的控件自定义属性浏览器支持。通过使用在设计时和运行时提供不同用户界面的可视化设计器类,复杂控件(如 GridView 控件)进一步增强了其设计时体验。ASP.NET 2.0 为服务器控件提供的设计器对象模型与 ASP.NET 1.0 和 1.1 中提供的模型大为不同。若要了解有关在 ASP.NET 2.0 中为您的控件实现自定义设计器类的信息,请参见 ASP.NET 控件设计器概述。
在 ASP.NET 2.0 中,服务器控件通过使用适配器类可以为客户端浏览器或设备定义不同行为。有关更多信息,请参见开发 ASP.NET 服务器控件的适配器
不同的浏览器和相同浏览器的不同版本支持不同的功能。ASP.NET 服务器控件将自动确定已请求 .ASPx 页的浏览器,并为该浏览器正确设置所生成的 HTML 标记的格式。但是,部分控件功能无法在较低版本的浏览器上呈现,因此需要在尽可能多的浏览器类型上查看页的输出,以确保页以预期方式呈现在所有浏览器中。有关更多信息,请参见 ASP.NET Web 服务器控件和浏览器功能。
请参见
Trackback: http://tb.blog.csdn.net/TrackBack.ASPx?PostId=1487298

