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