女女 - 2007-6-19 9:28:00
创建使用控件的页
创建使用自定义控件的页
在网站中创建一个名为 WelcomeLabelTest.aspx 的文本文件。
将以下标记复制到 WelcomeLabelTest.aspx 文件中并保存该文件。
Visual Basic 复制代码
<%@ Page Language="VB"%>
<html>
<head id="Head1" runat="server">
<title>WelcomeLabel Test</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<aspSample:WelcomeLabel Text="Hello" ID="WelcomeLabel1"
runat="server" BackColor="Wheat" ForeColor="SaddleBrown" />
</div>
</form>
</body>
</html>
C# 复制代码
<%@ Page Language="C#"%>
<html>
<head id="Head1" runat="server">
<title>WelcomeLabel Test</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<aspSample:WelcomeLabel Text="Hello" ID="WelcomeLabel1"
runat="server" BackColor="Wheat" ForeColor="SaddleBrown" />
</div>
</form>
</body>
</html>
在地址栏中输入以下 URL,以在浏览器中显示 WelcomeLabelTest.aspx:
复制代码
http://localhost/ServerControlsTest/WelcomeLabelTest.aspx
对控件的源代码做一些更改。例如,通过在 RenderContents 方法末尾处添加此行代码来多写一个字符串:
C# 复制代码
writer.Write("Testing how the App_Code directory works.");
Visual Basic 复制代码
writer.Write("Testing how the App_Code directory works.")
在浏览器中刷新 WelcomeLabelTest.aspx 页。
将看到,尽管没有编译控件,对控件所做的更改仍在页中反映出来了。
除了显式定义的 WelcomeLabel 控件的 Text 属性之外,从页中的控件实例可以看到,它还具有之前并没有定义的 BackColor 和 ForeColor 属性。WelcomeLabel 控件通过从 WebControl 基类继承,从而获取与样式相关的这些属性和其他属性。此外,WelcomeLabel 可自行分配外观并成为主题的一部分。
将控件编译为程序集
尽管利用 App_Code 目录可以不编译就对控件进行测试,但是如果您希望将您的控件作为对象代码分发给其他开发人员,则必须对其进行编译。此外,如果没有将控件编译为程序集,就不能将该控件添加到可视化设计器的工具箱中。
将控件编译为程序集
按照以下这些步骤设置计算机的 Windows 环境 PATH 变量,使其包含 .NET Framework 的安装路径:
在 Windows 中,右击“我的电脑”,选择“属性”,单击“高级”选项卡,然后单击“环境变量”按钮。
在“系统变量”列表中,双击 Path 变量。
在“变量值”文本框中,将一个分号 (;) 添加到文本框中的现有值的末尾,然后键入您的 .NET Framework 安装路径。.NET Framework 通常安装在位于 \Microsoft.NET\Framework\versionNumber 的 Windows 安装目录中。
单击“确定”关闭每个对话框。
从为本演练第一步中的源文件创建的目录中运行以下命令。
注意
这与复制控件源文件以进行测试的 App_Code 目录不同。
C# 复制代码
csc /t:library /out:Samples.AspNet.CS.Controls.dll /r:System.dll /r:System.Web.dll *.cs
Visual Basic 复制代码
vbc /t:library /out:Samples.AspNet.VB.Controls.dll /r:System.dll /r:System.Web.dll *.vb
/t:library 编译器选项告知编译器创建一个库,而不是创建一个可执行程序集。/out 选项为程序集提供名称,而 /r 选项则列出链接到您的程序集的那些程序集。
为保持示例独立,本演练要求创建具有单个控件的程序集。通常,.NET Framework 设计指导原则建议不要创建只包含很少的类的程序集。为了便于部署,应尽可能少地创建程序集。
在控件程序集中嵌入图标
可视化设计器(如 Visual Studio 2005)通常使用默认图标(如齿轮图像)显示工具箱中的控件。作为控件的一个选项,可以通过在控件的程序集中嵌入一个 16*16 像素的位图来自定义控件在工具箱中的外观。根据约定,可视化设计器将该位图最下方左侧的像素用作透明色。
在控件程序集中嵌入图标
创建或获取一个 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 System
Imports System.Web.UI
<Assembly: TagPrefix("Samples.AspNet.VB.Controls", "aspSample")>
标记前缀属性在命名空间 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# 复制代码
<controls>
<add tagPrefix="aspSample"
namespace="Samples.AspNet.CS.Controls"
assembly="Samples.AspNet.CS.Controls">
</add>
</controls>
Visual Basic 复制代码
<controls>
<add tagPrefix="aspSample"
namespace="Samples.AspNet.VB.Controls"
assembly="Samples.AspNet.VB.Controls">
</add>
</controls>
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 服务器控件和浏览器功能。
请参见
其他资源
开发自定义 ASP.NET 服务器控件
要提出有关“帮助”或本产品其他功能的建议或错误报告,请转到反馈站点。