当前位置:中国站长下载文章中心网页编程.NET编程 → ASP.NET服务器控件之RenderContents(3)

ASP.NET服务器控件之RenderContents(3)

减小字体 增大字体 作者:不详  来源:不详  发布时间:2006-8-14 8:34:18
     应用示例
  
    相信读者在浏览各个网站时,经常会看到"联系我们"等类似文字。当单击这些文字时,操作系统将自动打开自身所带的邮件客户端软件,提示用户发送邮件。本例将实现一个自定义服务器控件RenderContentsControl,其用于通过呈现包含"mailto:邮件地址"的超链接。本例的示例效果图如图1所示:
  
  
   如图1所示,页面中呈现了超链接文字"我的邮箱地址"。当单击该链接,系统将发送邮件给"my@mysample.com"。
  
    在实现以上控件之前,首先应分析如下:本控件包含外观元素,例如,文字大小、颜色、是否粗体等。为此,控件基类不应从Control类继承,而应从WebControl类继承。这样,开发人员将不必自行实现这些外观样式属性等内容。
  
    下面列举了实现自定义服务器控件的RenderContentsControl.cs文件源代码。
  
  using System;
  using System.ComponentModel;
  using System.Security;
  using System.Security.Permissions;
  using System.Web;using System.Web.UI;
  using System.Web.UI.WebControls;
  namespace UsingRenderContentsControl{
  [
   ASPNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal),
   AspNetHostingPermission(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal),   DefaultProperty("Email"), ParseChildren(true, "Text"),
   ToolboxData("<{0}:RenderContentsControl runat=server></{0}:RenderContentsControl>")
  ]
  
   public class RenderContentsControl : WebControl {
    // 实现Email属性
    [Bindable(true)]
    [Category("Appearance")]
    [DefaultValue("")] [Localizable(true)]
  
    public string Email
    {
     get {
      String s = (String)ViewState["Email"];
      return ((s == null) ? String.Empty : s);
     }
     set {
      ViewState["Email"] = value;
     }
    }
    // 实现Text属性
  
    [
     Bindable(true), Category("Appearance"), DefaultValue(""), Localizable(true),
     PersistenceMode(PersistenceMode.InnerDefaultProperty)
    ]
  
    public virtual string Text
    {
     get {
      string s = (string)ViewState["Text"];
      return (s == null) ? String.Empty : s;
     }
     set {
      ViewState["Text"] = value;
     }
    }
    // 重写TagKey属性
  
    protected override HtmlTextWriterTag TagKey
    {
     get {
      return HtmlTextWriterTag.A;
     }
    }
  
    // 重写AddAttributesToRender方法
  
    protected override void AddAttributesToRender(HtmlTextWriter writer)
    {
     base.AddAttributesToRender(writer);
     writer.AddAttribute(HtmlTextWriterAttribute.Href, "mailto:" + Email);
    }
  
    // 重写RenderContents方法
  
    protected override void RenderContents(HtmlTextWriter writer)
    {
     if (Text == String.Empty) {
      Text = Email;
     }
     writer.WriteEncodedText(Text);
    }
   }
  }
  
    如上代码所示,RenderContentsControl类继承自WebControl基类,其原因在前文已经说明。另外,在 RenderContentsControl类的实现过程中,还包括了元数据属性标记、3个属性(Email、Text和TagKey)和2两个方法(AddAttributesToRender和RenderContents)实现等内容。下面逐一对这些内容进行分析。
    做人要厚道,请注明转自chinazhan中国站长(www.ChinaZhan.com)。