MSDN中关于本节内容的演练:http://msdn.microsoft.com/zh-cn/library/yhzc935f(v=vs.100).aspx
微软的介绍已经足够详尽,我这里只是简单的说一下如何自定义Web 服务器控件。步骤大致如下:
- 新建一个控件类,使其继承自WebControl或要扩展的其它控件(例如 Button、TextBox等)
- 添加一些自己需要的属性和方法,然后重写Render、AddAttribute方法,使其可以在客户端展示。
- 功能完善以后,编译项目,在需要引用的地方添加Web.Config的配置项,使其可以正常的工作。
就拿MSDN中的演练来说,我们可以新建一个空的web项目,然后添加一个Controls目录(为了层次结构,不是必须的),然后新建一个Web Control的类,名字为WelcomeLabel,代码如下:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Security.Permissions; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace SampleCustomWebControl.Controls { [ AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal), AspNetHostingPermission(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal), DefaultProperty("Text"), ToolboxData("<{0}:WelcomeLabel runat=\"server\"> </{0}:WelcomeLabel>") ] public class WelcomeLabel : WebControl { [ Bindable(true), Category("Appearance"), DefaultValue(""), Description("The welcome message text."), Localizable(true) ] public virtual string Text { get { string s = (string)ViewState["Text"]; return (s == null) ? String.Empty : s; } set { ViewState["Text"] = value; } } protected override void RenderContents(HtmlTextWriter writer) { writer.WriteEncodedText(Text); if (Context != null) { string s = Context.User.Identity.Name; if (s != null && s != String.Empty) { string[] split = s.Split('\\'); int n = split.Length - 1; if (split[n] != String.Empty) { writer.Write(", "); writer.Write(split[n]); } } } writer.Write("!"); } } }
完全的微软的代码,没有什么改动。需要说一下的是,上面的一堆特性主要是为了在设计时使用的。
这里推荐从WebControl继承,而不是直接从Control类继承,因为WebControl 类从 Control 派生,并添加了与样式相关的属性,如 Font、ForeColor 和 BackColor。更贴近我们的使用习惯。
控件的绘制过程
在这个例子中,由于只设置了Text属性,并且是作为控件内容来呈现的,所以只需要重写RenderContents就可以了。
控件在绘制的过程中,先调用Render方法,在Render方法中再调用RenderBeginTag、RenderContents和RenderEndTag方法。RenderBeginTag和RenderEndTag 方法是绘制标签的开始和结束的,他们依赖与TagName字段,只要重写了类的TagName字段,这两个方法就没有必要进行重写了。
如果需要向控件中添加一些属性,则需要重写AddAttributesToRender方法。
使用自定义Web服务器控件
将项目编译为.dll文件以后,在web项目中引用。
添加webConfig的配置:
<pages> <controls> <add tagPrefix="cc" namespace="SampleCustomWebControl.Controls" assembly="SampleCustomWebControl" /> </controls> </pages>
在页面中使用:
<cc:WelcomeLabel ID="lblWelcome" runat="server" Text="欢迎访问"></cc:WelcomeLabel>
程序中也可以动态的改变其Text属性:
lblWelcome.Text = "欢迎访问,服务器时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");