首页 > 代码库 > ASP.NET 2.0 自定义控件开发(一)页面呈现[转]

ASP.NET 2.0 自定义控件开发(一)页面呈现[转]

ASP.NET 2.0 自定义控件开发(一)页面呈现[转]

 

 

http://www.cnblogs.com/yanyangtian/archive/2008/08/25/1275741.html  此网页文章不错。

          编写自定义控件首先要选择基类。  

         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>用户名&nbsp;&nbsp;<input");             writer.WriteLine(@"style=""font-size: 12px; color: #0000FF; text-decoration: blink; width:100px;"" type=""text"" /><br />");             writer.WriteLine(@"密&nbsp;&nbsp;&nbsp; 码&nbsp;&nbsp;");             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("用户名&nbsp;&nbsp;");             //添加用户名登录框样式和属性             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("密&nbsp;&nbsp;&nbsp; 码&nbsp;&nbsp;");             //结束用户名登录框             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("用户名&nbsp;&nbsp;");             //添加用户名登录框样式和属性             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("密&nbsp;&nbsp;&nbsp; 码&nbsp;&nbsp;");             //结束用户名登录框             writer.RenderEndTag();             //添加密码登录框样式和属性             writer.AddAttribute(HtmlTextWriterAttribute.Type, "password");             writer.AddStyleAttribute(HtmlTextWriterStyle.FontSize, "12px");             writer.AddStyleAttribute(HtmlTextWriterStyle.BackgroundColor, "#FF00FF");             //开始密码登录框             writer.RenderBeginTag(HtmlTextWriterTag.Input);             //结束密码登录框             writer.RenderEndTag();         } 三:CompositeControl的呈现方法(暂时)