ASP.NET服务器端控件的编程架构(一)
自本篇文章起,我会连续发表一系列的ASP.NET服务器端控件的编程架构。 在讨论本篇的主旨之前我们有必要了解一下服务器控件的层次结构。在System.Web程序集中,ASP.NET服务器控件类是在System.Web.UI、Sytsem.Web.UI.Controls、System.Web.UI.WebControls名字空间里实现的。图一对这些命名空间提供了高层视图。
(图一)
所有的服务器控件都是直接或间接的从System.Web.UI.Control继承的。Page和UserControl列分别描述课.aspx和ascx文件,而LiteralControl表示这些文件的静态内容的一个连续的范围。在System.Web.UI.HtmlControls命名空间内,HtmlCotrol抽象类为所有Html服务器端控件提供一个基类,这些控件用runat="server" attribute中简单的html标签来标识,并提供了html4.0标签的简单的服务器封装(注意:微软并不推荐从HtmlControl类继承,详情参见SDK文档),在这里请注意了,HtmlControls和WebControls名字空间的控件都是服务器控件,而我们主要讨论的是WebControls,为了以后讨论的方便,我们以后称WebControls为Web控件。Web控件大都是从System.Web.UI.WebControls继承而来。
为了开发服务器控件,我们必须实现控件在服务器端所需的全部逻辑,包括初始化,加载状态视图,跟踪状态视图,加载回传数据,加载,引发回传数据修改事件,引发回传事件,然而令我们兴奋的是,这些繁琐而艰难的工作我们都不必做了,微软已经在一个System.Web.UI.Control的类中实现了所有的底层封装,我们所要做的就是从它派生一个类,编写完成我们所需的代码,其他的实现有基类方法实现,这听起来多么美好,然而确实真的。
下面我们编写一个简单的例子来验证我刚才的讨论。 这个服务器控件其实并没有什么功能,他只是在页面显示一行有span标签包含静态编码的文本,但是他却验证了我刚才所说的话。



















这里我所使用的工具是Vc#2005,如果你使用的也是,或者是VS.NET那么可以直接生成,如果使用的其他的文本编辑工具,则要使用命令行编译,具体命令如下:csc /t:library /out:XiuYanger.ProCSharp.Controls.dll /r:System.Web.dll SimpleControl.cs。有关命令行的编译请参照SDK文档。
编译好了,我们就可以使用这个服务器控件了。
首先把编译好的.dll文件复制到你将要创建的web应用程序的bin目录中,如果没有请创建一个,一定要命名为bin且要在web应用程序的根目录中。
新建一个aspx文件,编辑,如果使用vs.net或者是vwd则直接加入Register指令就可以,如下。
















添加虚拟目录,如果有,直接复制到目录中,在浏览器中测试,完好!
下面讲解一下各步骤中的实现:
首先新建了一个类,这个类就是我们所要编写的服务器控件。编码的注释中我提到过一定要有名称空间,看一下Register指令我们就会明白为什么,命名控件之所以允许在页面中声明地使用控件,是因为Register指令中的标签前缀被映射到声明的控件所在的名称空间了。
我们的类继承了System.Web.UI.Control类,刚才提到了这个类封装了服务器控件在服务器端所要执行的底层逻辑。
我们重载了Render方法,这个方法用于控件在Render生命周期中呈现HTML流,这个html流就是我们最终看到的页面。有关呈现的问题我会在下一篇ASP.NET服务器端控件的编程架构(二)中详细的介绍。
最后Render方法的参数HtmlTextWriter,他是一个工具类,在System.Web.UI名字空间内。它封装了将HTML写成文本流的功能函数,我会在下一篇中详细的介绍它。
近期文章将会包含:
ASP.NET服务器端控件的编程架构(二):详细介绍Control的呈现架构和WebControl的呈现架构以及HtmlTextWriter类。
ASP.NET服务器端控件的编程架构(三):详细介绍简单视图管理
ASP.NET服务器端控件的编程架构(四):详细介绍数据回传处理和引发数据回传更改事件。
ASP.NET服务器端控件的编程架构(五):详细介绍引发回传事件。