前面我们已经做了一个最简单的TextBox的马甲,此篇文章,我们来讲讲自定义控件的标签。大家可能看到了上一篇中拖放进来的代码是
<cc1:TextEdit ID="TextEdit1" runat="server"></cc1:TextEdit>,这肯定不是我们想要的结果了,cc1这种标签命名不好,而且给人感觉也“太水了”,现在我们来改进代码
using System; using System.Text; using System.Web.UI; using System.ComponentModel;//包含组件开发所必须含有的(属性)Attribute; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using System.Collections.Generic; namespace XYB.Controls { [assembly:TagPrefix("XYB.Controls","XYB")]//命名空间+标签名 public class TextEdit:TextBox { } }
其实我们就只加一行代码,我们再来看一下UI层的代码吧
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="TextEditUI.aspx.cs" Inherits="XYB.UI.TextEditUI" %> <!--此行代码是自动生成--> <%@ Register Assembly="XYB.Controls" Namespace="XYB.Controls" TagPrefix="cc1" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <!--标签还是没有发生什么变化--> <cc1:TextEdit ID="TextEdit1" runat="server"></cc1:TextEdit> </form> </body> </html>
我们发现标签还是cc1,我们会看到上面的<%@ Register Assembly="XYB.Controls" Namespace="XYB.Controls" TagPrefix="cc1" %>
TagPrefix="cc1",我们只需要把TagPrefix="cc1"改成TagPrefix="XYB",现在我们再拖一个控件进来看看
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="TextEditUI.aspx.cs" Inherits="XYB.UI.TextEditUI" %> <!--此行代码是自动生成--> <%@ Register Assembly="XYB.Controls" Namespace="XYB.Controls" TagPrefix="XYB" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <!--标签还是没有发生什么变化--> <cc1:TextEdit ID="TextEdit1" runat="server"></cc1:TextEdit> <!--标签已经发生变化--> <XYB:TextEdit ID="TextEdit2" runat="server"></XYB:TextEdit> </form> </body> </html>
现在标签已经什么变化了<XYB:TextEdit ID="TextEdit2" runat="server"></XYB:TextEdit>。现在总算是变了,但是细想一下,我们还有更好的做法。以后我们把这个类库做大了,里面封装了好多类,难道我们是不是每个页面上都去加一句
[assembly:TagPrefix("XYB.Controls","XYB],<%@ Register Assembly="XYB.Controls" Namespace="XYB.Controls" TagPrefix="XYB" %>吗?这显然是不科学的,先不说维护起来困难,日后还会遭人鄙视,还是有很多的重复工作的。
我们修改一下web.config文件,在<system.web>节点下面加上如下代码
<pages controlRenderingCompatibilityVersion="4.0" clientIDMode="AutoID">
<controls>
<add namespace="XYB.Controls" assembly="XYB.Controls" tagPrefix="XYB"/>
</controls>
</pages>
我整个配置文件代码如下
<?xml version="1.0" encoding="utf-8"?> <!-- 有关如何配置 ASP.NET 应用程序的详细消息,请访问 http://go.microsoft.com/fwlink/?LinkId=169433 --> <configuration> <system.web> <compilation debug="true" targetFramework="4.0" /> <pages controlRenderingCompatibilityVersion="4.0" clientIDMode="AutoID"> <controls> <add namespace="XYB.Controls" assembly="XYB.Controls" tagPrefix="XYB"/> </controls> </pages> </system.web> </configuration>
现在我们把TextEditUI.aspx之前的拖进来的代码注释掉,或者删掉也行。把TextEdit类中的[assembly:TagPrefix("XYB.Controls","XYB")]代码也删掉。重新生成。
TextEdit.cs代码如下:
using System; using System.Text; using System.Web.UI; using System.ComponentModel;//包含组件开发所必须含有的(属性)Attribute; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using System.Collections.Generic; namespace XYB.Controls { public class TextEdit:TextBox { } }
HTML代码如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="TextEditUI.aspx.cs" Inherits="XYB.UI.TextEditUI" %> <!--此行代码是自动生成--> <%--<%@ Register Assembly="XYB.Controls" Namespace="XYB.Controls" TagPrefix="XYB" %>--%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <!--标签还是没有发生什么变化--> <%--<cc1:TextEdit ID="TextEdit1" runat="server"></cc1:TextEdit> --%> <!--标签已经发生变化--> <%-- <XYB:TextEdit ID="TextEdit2" runat="server"></XYB:TextEdit>--%> </form> </body> </html>
我们再来拖进一个控件进来,标签还是发生改变
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="TextEditUI.aspx.cs" Inherits="XYB.UI.TextEditUI" %> <!--此行代码是自动生成--> <%--<%@ Register Assembly="XYB.Controls" Namespace="XYB.Controls" TagPrefix="XYB" %>--%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <!--标签还是没有发生什么变化--> <%--<cc1:TextEdit ID="TextEdit1" runat="server"></cc1:TextEdit> --%> <!--标签已经发生变化--> <%-- <XYB:TextEdit ID="TextEdit2" runat="server"></XYB:TextEdit>--%> <XYB:TextEdit ID="TextEdit1" runat="server"></XYB:TextEdit> </form> </body> </html>
至此,才算是真的大功告成。
Render呈现控件,并讨论Render,RenderControl,RenderChilden之间的关系