asp.net2.0自定义服务器控件开发(二)

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  Samples.AspNet.CS.Controls {     [     DefaultProperty("Email"),     //true:把包含在服务器控件标记内的元素解释为Text属性 (Property)     //false:解释为控件     ParseChildren(true"Text"),     ToolboxData("<{0}:MailLink runat="server"> </{0}:MailLink>")     ]     public class MailLink : WebControl     {         //默认输出标记为span         //更改方法一         //public MailLink()         //    : base(HtmlTextWriterTag.A)         //{ }         [         Bindable(true),         Category("Appearance"),         DefaultValue(""),         Description("The e-mail address.")         ]         public virtual string Email         {             get             {                 string s = (string)ViewState["Email"];                 return (s == null? String.Empty : s;             }             set             {                 ViewState["Email"= value;             }         }         [         Bindable(true),         Category("Appearance"),         DefaultValue(""),         Description("The text to display on the link."),         Localizable(true),         //将Text属性定义为内部文本,默认属性         PersistenceMode(PersistenceMode.InnerDefaultProperty)         ]         public virtual string Text         {             get             {                 string s = (string)ViewState["Text"];                 return (s == null? String.Empty : s;             }             set             {                 ViewState["Text"= value;             }         }         //方法二         protected override HtmlTextWriterTag TagKey         {             get             {                 return HtmlTextWriterTag.A;             }         }         protected override void AddAttributesToRender(             HtmlTextWriter writer)         {             //base.AddAttributesToRender(writer);             writer.AddAttribute(HtmlTextWriterAttribute.Href,                 "mailto:" + Email);         }         protected override void RenderContents(HtmlTextWriter writer)         {             if (Text == String.Empty)             {                 Text = Email;             }             //进行html编码             writer.WriteEncodedText(Text);         }     } }

 

以上MailLink类继承自 System.Web.UI.WebControls.WebControl

再来看一个MailLink2,它继承于System.Web.UI.Control

         protected   override   void  Render(HtmlTextWriter writer)          {             //先给标记添加样式和属性,然后再输出标记             writer.AddStyleAttribute(HtmlTextWriterStyle.Color, "red");             writer.AddAttribute(HtmlTextWriterAttribute.Href, "mailto:" + Email);             writer.RenderBeginTag(HtmlTextWriterTag.A);             writer.Write(Text);             writer.RenderEndTag();         }

比较上面两段代码,执行结果一致,明显MailLink2的代码比较简洁也较为灵活(注意都是先添加样式和属性,再输出标记的)

但是在属性编辑器里面,MailLink控件有ForeColor等属性可供设置

而MailLink2控件是没有的

因为MailLink控件继承自WebControl

为什么继承自Control的MailLink2只需要重写Render方法呢

// RenderControl方法的基本实现   public   void  RenderControl(HtmlTextWriter writer)   {  if(Visible)  {  Render(writer);  }  }   // Render方法基本实现   protected   virtual   void  Render(HtmlTextWriter writer)   {  RenderChildren(writer);  }   // RenderChildren方式基本实现   protected   virtual   void  RenderChildren(HtmlTextWriter writer)   {  foreach (Control c in Controls)  {  c.RenderControl(writer);  }  }

发现一个问题

不管是MailLink还是MailLink2控件都是读取标记之间的内容作为Text属性的

但是在属性编辑器中对Text属性进行赋值,标记之间不会写入任何东西。

这个以后再研究,先放着。

最后更正一个错误

MailLink中的AddAttributesToRender方法中的base.AddAttributesToRender(writer);不能删除掉

应该始终调用,作用就是将父类(WebControl类)的相关属性(ForeColor)添加到开始标记中去。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值