ASP.NET2.0服务器控件之创建自定义控件(2)

2013 年 8 月 12 日4300

ASP.NET2.0服务器控件之创建自定义控件(2)


http://http://www.zjjv.com//.cn 2006年05月22日14:40 天极yesky

  (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 != null && s != String.Empty)
    {
     string[] split = s.Split('');
     int n = split.Length - 1;
     if (split[n] != String.Empty)
     {
      writer.Write(",");
      writer.Write(split[n]);
     }
    }
   }
   writer.Write("!");
  }
 }
}

  代码说明之控件基类:

  如果服务器控件需要呈现用户界面(UI)元素或任何其他客户端可见的元素,则应该从System.Web.UI.WebControls.WebControl(或派生类)派生该控件。如果控件要呈现在客户端浏览器中不可见的元素(如隐藏元素或meta元素),则应从System.Web.UI.Control派生该控件。本例显然需要呈现用户界面元素,因此,自定义服务器控件类WelcomeLabel从WebControl基类继承。由于WebControl类从Control派生,因此,WelcomeLabel控件则自动继承基类提供的成员对象,这些对象多数与用户界面元素呈现有关,例如,Font、ForeColor、BackColor、Width等等。另外,同样也是由于从WebControl继承,因此,WelcomeLabel控件还自动实现ASP.NET 2.0新增的主题和皮肤功能。实际上,由于WelcomeLabel控件与ASP.NET 2.0的内置服务器控件Label有着很多相似之处,因此,从功能实现的角度出发,最好的方式应该是使得WelcomeLabel控件类从Label类继承。然而,本例为了说明定义属性和定义属性元数据的实现方法,因此,从WebControl基类继承。

  代码说明之Text属性:

  如上源代码所示,WelcomeLabel实现了一个Text属性,并使用视图状态存储该属性值。使用视图状态保存回发间的Text值。每次回发时,将重新创建页并从视图状态还原值。如果Text值并未存储在视图状态中,则在每次回发时会将值设置为其默认的Empty。ViewState属性继承自WebControl,是保存数据值的字典。通过使用String键,可输入和检索值。本例中将"Text"用作键。字典中的项被类型化为Object,然后必须将其强制转换为属性类型。

[上一页] [1] [2] [3] [下一页]

0 0