日期:2010-08-29  浏览次数:20338 次

  摘要

  本文将详细讲解一个简单的自定义服务器控件的创建过程。通过这些内容,读者将了解利用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 !