摘要 本文将详细讲解一个简单的自定义服务器控件的创建过程。通过这些内容,读者将了解利用Visual Studio 2005,创建和测试自定义服务器控件的基本方法。
注意:本文内容基于ASP.NET 2.0技术撰写,示例应用程序使用Visual Studio 2005进行开发。
创建一个简单的自定义服务器控件 创建自定义服务器控件的过程包括:
(1)创建一个测试用Web站点应用程序;
(2)为新建站点应用程序,新增一个Web控件库项目;
(3)编写、编译和测试自定义服务器控件。
(1)创建一个测试用Web站点应用程序
利用Visual Studio 2005,创建Web站点应用程序的方法很多,例如,在本地文件系统中创建、在IIS支持下创建、在FTP站点中创建、在远程站点中创建等等。然而,无论如何,开发人员都应首先打开Visual Studio 2005,然后,单击"文件"菜单下"新建网站..."项目。这时,将弹出如下图1的对话框。
图1 新建网站对话框
图1是新建网站对话框。在该对话框中,开发人员需要选择创建模板,位置、编程语言。如图1所示,示例采用了ASP.NET网站模板,文件系统和C#编程语言来创建。当单击"确定"按钮之后,Visual Studio 2005将在本机D:\AppTest下创建一个test1文件夹。所有应用程序文件都存储在文件夹内。默认情况下,test1文件夹内包括一个空的用于存储应用程序数据文件的App_Data文件夹,同时还分别包括一个Default.aspx和Default.aspx.cs文件。
通过以上步骤就创建了一个Web站点应用程序。该Web站点将用于测试所创建的Web自定义服务器控件。
(2)新增自定义服务器控件项目
在创建Web站点应用程序之后,开发人员还必须在当前站点项目中,添加一个自定义服务器控件项目,也就是Web控件库项目。实现方法是:在打开Web站点应用程序的前提下,单击"文件"菜单中"添加"项的子项"新建项目"。此时,Visual Studio 2005将弹出如图2的对话框。
图2 添加新项目对话框
图2是添加新项目对话框截图。该对话框分为三个设置部分:项目类型、模板、名称和位置。
在对话框左侧有一个树形列表,其中包括各种项目类型。为创建Web控件库项目,应选择"Visual C#"节点的子节点"Windows"。此时,对话框右侧将出现该子节点对应的已安装模板,其中包括Windows应用程序、类库、Web控件库等。开发人员应选中"Web控件库"一项。最后,需要设置Web控件库项目的名称和位置。为了便于管理,建议将Web控件库项目和测试站点项目存储在同一文件夹内,因此,本例将名称设置为"HelloMyControl",将位置设置为D:\AppTest\test1。当单击"确定"按钮之后,Visual Studio 2005将在D:\AppTest\test1目录下,自动创建一个HelloMyControl用于存储Web控件库相关文件。同时,Visual Studio 2005的"解决方案资源管理器"将显示如图3所示内容。
图3 解决方案资源管理器
如图3所示,解决方案资源管理器中包括两个项目。一个是前文创建的Web站点项目,另一个是名为HelloMyControl的Web控件库项目,其中默认包括一个WebCustomControl1.cs文件。下面就可以开始编写、编译和测试自定义服务器控件了。
(3)编写、编译和测试自定义服务器控件
需要实现的自定义服务器控件WelcomeLabel功能很简单。类似于一个标准Label控件。WelcomeLabel控件从System.Web.UI.WebControls. WebControl继承,其中自定义了一个string类型的Text属性。当控件运行时,将显示Text属性值和当前用户名的组合文字。例如,将Text属性值设置为"您好",那么最终显示的是"您好,某某!"。开发人员可以用WelcomeLabel控件作为站点欢迎页面的一部分。
WelcomeLabel控件的实现代码包含在WebCustomControl1.cs文件中。该文件源代码如下所示。
using System;
using System.Collections.Generic;
using System.Security.Permissions;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace HelloMyControl
{
[
AspNetHostingPermission (SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal ),
AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal ),
DefaultProperty ( "Text" ),
ToolboxData ( "<{0}:WelcomeLabel runat=\"server\" > </{0}:WelcomeLabel>")
]
public class WelcomeLabel : WebControl
{
// 实现Text属性
[
Bindable(true), Category("Appearance"), DefaultValue(""), Description("文本内容."), Localizable(true)
]
public virtual string Text
{
get
{
string s = (string)ViewState["Text"];
return (s == null) ? String.Empty : s;
}
set
{
ViewState["Text"] = value;
}
}
// 重写RenderContents方法
protected override void RenderContents(HtmlTextWriter writer)
{
// 对Text属性值编码,并写入输入流中
writer.WriteEncodedText(Text);
// 判断Web请求是否有效。如果有效,则设置内容,并写入输出流中
if (Context != null)
{
// 获取当前用户名
string s = Context.User.Identity.Name;
// 如果当前用户名不为空,则分析用户名并按照指定格式写入输出流中
if (s !