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 ![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
[
DefaultProperty("Email"),
//true:把包含在服务器控件标记内的元素解释为Text属性 (Property)
//false:解释为控件
ParseChildren(true, "Text"),
ToolboxData("<{0}:MailLink runat="server"> </{0}:MailLink>")
]
public class MailLink : WebControl ![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
//默认输出标记为span
//更改方法一
//public MailLink()
// : base(HtmlTextWriterTag.A)
//{ }
[
Bindable(true),
Category("Appearance"),
DefaultValue(""),
Description("The e-mail address.")
]
public virtual string Email ![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
get ![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
string s = (string)ViewState["Email"];
return (s == null) ? String.Empty : s;
}
set ![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
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 ![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
get ![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
string s = (string)ViewState["Text"];
return (s == null) ? String.Empty : s;
}
set ![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
ViewState["Text"] = value;
}
}
//方法二
protected override HtmlTextWriterTag TagKey ![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
get ![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
return HtmlTextWriterTag.A;
}
}
protected override void AddAttributesToRender(
HtmlTextWriter writer) ![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
//base.AddAttributesToRender(writer);
writer.AddAttribute(HtmlTextWriterAttribute.Href,
"mailto:" + Email);
}
protected override void RenderContents(HtmlTextWriter writer) ![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if (Text == String.Empty) ![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
Text = Email;
}
//进行html编码
writer.WriteEncodedText(Text);
}
}
}
以上MailLink类继承自 System.Web.UI.WebControls.WebControl
再来看一个MailLink2,它继承于System.Web.UI.Control
protected
override
void
Render(HtmlTextWriter writer) ![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
//先给标记添加样式和属性,然后再输出标记
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) ![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
if(Visible) ![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
Render(writer);
}
}
//
Render方法基本实现
protected
virtual
void
Render(HtmlTextWriter writer) ![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
RenderChildren(writer);
}
//
RenderChildren方式基本实现
protected
virtual
void
RenderChildren(HtmlTextWriter writer) ![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
foreach (Control c in Controls) ![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
c.RenderControl(writer);
}
}
发现一个问题
不管是MailLink还是MailLink2控件都是读取标记之间的内容作为Text属性的
但是在属性编辑器中对Text属性进行赋值,标记之间不会写入任何东西。
这个以后再研究,先放着。
最后更正一个错误
MailLink中的AddAttributesToRender方法中的base.AddAttributesToRender(writer);不能删除掉
应该始终调用,作用就是将父类(WebControl类)的相关属性(ForeColor)添加到开始标记中去。