技术开发 频道

Asp.net控件开发之创建控件

 【IT168 技术】在asp.net中,控件被分为两类.用户控件和自定义服务器控件。前者就是我们经常用来将一些可复用的内容封装成的.ascx文件。这里主要研究后者。

  创建自定义服务器控件

  创建自定义控件的第一步是选择以哪一个类作为基类来创建控件,Asp.net最常见的几个基类罗列如下:

  •   System.Web.UI.Control:这是所有控件的基类,所有作为控件的类都必须直接或者间接的继承此类,此类仅仅提供最少量的属性和方法。
  •   System.Web.UI.WebControls.WebControl:这个类继承于Control类,在实现控件最基本的属性和方法后,又额外提供了控件CSS样式相关的一系列属性。如果是UI控件,那肯定就选它了.
  •   System.Web.UI.WebControls.Webpart:这个不用说了,看名字就知道是提供了WebPart相关的功能.
  •   System.Web.UI.WebControls.CompositeControl:如果需要创建复合控件(即那些控件内部还有其他控件,比如Calender),选择这个类作为基类.
  •   System.Web.UI.WebControls.DatabindingControl:用于作为数据源相关控件的基类。
  •   System.Web.UI.WebControls.CompositeDatabindingControl:这个基类可以看做上面两个基类的结合,提供了上面两个基类的功能,GridView就是继承自这个基类.

  简单控件Or复合控件

  先来了解一下简单控件和复合控件的定义:

  简单控件:那些直接生成(render)对应HTML的控件,比如Botton和TextBox控件.

  复合控件:如何生成HTML依赖于其子控件,比如Reperater,FormView.

  下面的图示会让概念更加清晰:

图1  控件概念

  简单控件是那些比较简单的更加,往往是一个控件对应一个HTML标签.但缺点显而易见,就是当面对大量HTML代码片段时,就会显得更加难以维护.

  复合控件在面对大量HTML代码片段时就显得游刃有余了,在遵守了面向对象抽象和封装的原则上,复合控件的维护性和易用性都不错.

  Demo:创建一个简单的服务器控件:

  这里我们创建一个简单的菜单自定义服务器控件。通过继承最基础的System.Web.UI.Control基类。然后覆盖Render方法来达到自定义输出的目的,代码如下:

namespace SimpleControl

{

   [ToolboxData(
"<{0}:menucustomcontrol runat=server></{0}:menucustomcontrol>")]

    
public class MenuCustomControl : Control

    {

        
protected override void Render(HtmlTextWriter writer)

        {

            
base.Render(writer);

            writer.WriteLine(
"<div>");

            RenderMenuItem(writer,
"网易", "http://www.163.com");

            writer.Write(
" | ");

            RenderMenuItem(writer,
"新浪", "http://www.sina.com");

            writer.Write(
" | ");

            RenderMenuItem(writer,
"MSDN", "http://msdn.microsoft.com");

            writer.Write(
" | ");

            RenderMenuItem(writer,
"ASP.NET", "http://asp.net");

            writer.WriteLine(
"</div>");

        }

        
private void RenderMenuItem(HtmlTextWriter writer, string title, string url)

        {

            writer.Write(
"<span><a href=""");

            writer.Write(url);

            writer.Write(
""">");

            writer.Write(title);

            writer.WriteLine(
"</a><span>");

        }

    }

}

  通过HtmlTextWriter类,我们可以在控件原有的基础上,加入我们自己想加入的内容,注意base.Render(writer);方法,通过调用父类的Render方法,我们可以再实现父类的基础上,加入我们额外的内容(很像设计模式里的装饰模式)

0