应用示例
相信读者在浏览各个网站时,经常会看到"联系我们"等类似文字。当单击这些文字时,操作系统将自动打开自身所带的邮件客户端软件,提示用户发送邮件。本例将实现一个自定义服务器控件RenderContentsControl,其用于通过呈现包含"mailto:邮件地址"的超链接。本例的示例效果图如图1所示:

图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)实现等内容。下面逐一对这些内容进行分析
相信读者在浏览各个网站时,经常会看到"联系我们"等类似文字。当单击这些文字时,操作系统将自动打开自身所带的邮件客户端软件,提示用户发送邮件。本例将实现一个自定义服务器控件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)实现等内容。下面逐一对这些内容进行分析