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)添加到開始標記中去。

發佈了21 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章