编写自定义控件首先要选择基类。
1.所有的标准控件都可以作为基类。你可以选择你需要的标准控件来重写新的控件
2.如果从标准控件找不到适合的基类,则可以使用以下三种中的一种
a)System.Web.UI.Control(所有ASP.NET控件的基类)
b)System.Web.UI.WebControls.WebControl(继承自a)
c)System.Web.UI.WebControls.CompositeControl(继承自b)
一:Control的呈现方法
Control是通过重写它的Render()方法来实现呈现的。
Render方法的声明:
Code protected internal vitrual void Render(HtmlTextWrite output) { //todo }
protected和virtual二个Attribute得存在,所以继承于Control的类可以重写Render方法来实现自己的呈现逻辑。
internal这个Attribute使得该方法只能在ASP.NET框架中直接调用,而不能在其他代码中直接调用。
1.HelloWorld
来个最简单的,就是在页面上呈现一句话:HelloWorld
Code using System; using System.Collections.Generic; using System.Text; using System.Web.UI; namespace HelloWorld { /**//// <summary> /// HelloWorld自定义控件 /// </summary> public class HelloWorld:System.Web.UI.Control { protected override void Render(HtmlTextWriter writer) { writer.WriteLine("HelloWorld"); } } }
注意事项:
a)当我们把他添加到页面的时候,IDE会自动添加这样一句代码
Code <%@ Register assembly="HelloWorld" namespace="HelloWorld" tagprefix="cc1" %>
TagPrefix属性是声明控件前缀,IDE默认是ccl,当然我们可以自己来定义为自己喜欢的。(最好不要改成asp,免得和标准控件混淆)
自定义TagPreFix有2种方法:
一种是在ASPX页面中修改,这样只会影响当前页面的。而不能修改整个项目。
另一种自然是修改整个项目的,需要在web.config文件中修改,在System.web下加上下面一段代码
Code <pages> <controls> <add assembly="HelloWorld" namespace="HelloWord" tagPrefix="Sky"/> </controls> </pages> 2.Login
我们可以通过Render()方法中的writeLine方法来输出一行行的代码,但是这样比较复杂也容易出错。所以我们还可以HtmlTextWrite
得三个其他方法来更方便的帮组我们向页面添加Html代码。HtmlTextWriteTag(表示Html标签),HtmlTextWriteAttribute(表示HTML
标签的属性),HtmlTextWriteStyle(标示HTML标签的样式).
为了和上面的直接输入比较我们对比下面两段代码:
Code protected override void Render(HtmlTextWriter writer) { writer.WriteLine(@"<div>用户名 <input"); writer.WriteLine(@"style=""font-size: 12px; color: #0000FF; text-decoration: blink; width:100px;"" type=""text"" /><br />"); writer.WriteLine(@"密 码 "); writer.WriteLine(@"<input style=""background-color: #FF00FF; width:100px;"" type=""password"" /></div>"); }
Code protected override void Render(HtmlTextWriter writer) { //开始最外层的Div writer.RenderBeginTag(HtmlTextWriterTag.Div); //添加文字 writer.WriteLine("用户名 "); //添加用户名登录框样式和属性 writer.AddAttribute(HtmlTextWriterAttribute.Type, "text"); writer.AddStyleAttribute(HtmlTextWriterStyle.Width, "100px"); writer.AddStyleAttribute(HtmlTextWriterStyle.FontSize, "12px"); writer.AddStyleAttribute(HtmlTextWriterStyle.Color, "0000FF"); writer.AddStyleAttribute(HtmlTextWriterStyle.TextDecoration, "blink");
//开始用户名登录框 writer.RenderBeginTag(HtmlTextWriterTag.Input); //添加换行符号 writer.RenderBeginTag(HtmlTextWriterTag.Br); //结束换行符号 writer.RenderEndTag(); //添加密码文字 writer.WriteLine("密 码 "); //结束用户名登录框 writer.RenderEndTag(); //添加密码登录框样式和属性 writer.AddAttribute(HtmlTextWriterAttribute.Type, "password"); writer.AddStyleAttribute(HtmlTextWriterStyle.FontSize, "12px"); writer.AddStyleAttribute(HtmlTextWriterStyle.BackgroundColor, "#FF00FF"); //开始密码登录框 writer.RenderBeginTag(HtmlTextWriterTag.Input); //结束密码登录框 writer.RenderEndTag(); //结束最外层Div writer.RenderEndTag();
}
二者呈现的内容是一样的但是第二种第一种书写更有层次感。
在第二段代码中要注意的是书写顺序,要先书写属性和样式,然后在书写标签(就是在调用书写标签的BeginTag之前)。
同时如果要写的样式在HtmlTextWriteAttribut枚举中没有,我们可以直接来写如:
write.AddStyleAttribute("alt","你好");
二:WebControl的呈现方法
由于WebControl继承自Control所以他的呈现方法只是对Control方法的改进和扩展。
他把Render()方法一分为三:WebControl.RenderBeginTag()(最外层标签)、WebControl.RenderContents()(页面中标签中内容)、 WebControl.RenderEndTag()(最外层结束标签).
其中, WebControl.RenderBeginTag()方法所产生的Html标签有WebControl.TagKey或WebControl.TagName属性决定的。
TagKey是HtmlTextWriteTag的枚举值,如果没有这个枚举值,则设置TagKey为Unkown并且设置TagName(String类型).
如果你需要给最外层标签添加属性则可以重写WebControl.AddAttributesToRender()方法
一般我们不重写WebControl.RenderBeginTag()方法而是重写Tagkey或者TagName属性来实现对最外层标签的控制。
Code //重写TagKey添加最外层标签 protected override System.Web.UI.HtmlTextWriterTag TagKey { get { return HtmlTextWriterTag.Div; } } //重写RenerContents protected override void RenderContents(HtmlTextWriter writer) { //添加文字 writer.WriteLine("用户名 "); //添加用户名登录框样式和属性 writer.AddAttribute(HtmlTextWriterAttribute.Type, "text"); writer.AddStyleAttribute(HtmlTextWriterStyle.Width, "100px"); writer.AddStyleAttribute(HtmlTextWriterStyle.FontSize, "12px"); writer.AddStyleAttribute(HtmlTextWriterStyle.Color, "0000FF"); writer.AddStyleAttribute(HtmlTextWriterStyle.TextDecoration, "blink");
//开始用户名登录框 writer.RenderBeginTag(HtmlTextWriterTag.Input); //添加换行符号 writer.RenderBeginTag(HtmlTextWriterTag.Br); //结束换行符号 writer.RenderEndTag(); //添加密码文字 writer.WriteLine("密 码 "); //结束用户名登录框 writer.RenderEndTag(); //添加密码登录框样式和属性 writer.AddAttribute(HtmlTextWriterAttribute.Type, "password"); writer.AddStyleAttribute(HtmlTextWriterStyle.FontSize, "12px"); writer.AddStyleAttribute(HtmlTextWriterStyle.BackgroundColor, "#FF00FF"); //开始密码登录框 writer.RenderBeginTag(HtmlTextWriterTag.Input); //结束密码登录框 writer.RenderEndTag(); } 三:CompositeControl的呈现方法(暂时)