Inside ASP.NET 2.0 – Controls Model 文/黄忠成 (原文刊登于Run! PC)
读者基础需求:了解ASP.NET 控件设计技巧參考书目:深入剖析ASP.NET 组件设计(碁峯)、
Developing ASP.NET Server Controls And Components(MS Press)
Controls Model 的变革
如你所知晓,ASP.NET 1.x 提供了设计师丰富且易用的控件群,藉由这些控件,设计师可以快速的建构网页程序,但除了这些表面上看得到的控件外,为了实现组件化设计的理想,ASP.NET 1.x 还提供了简单但完整的Controls Model ,让设计师可以自行撰写控件來增加开发速度,并藉由组件化开发模式來简化程序的复杂度与降低出错率。在ASP.NET 2.0 中,这个Controls Model 做了相当大幅度的延伸,除了相容于原來的Controls Model 外,新的Controls Model 还提供了比以往更加丰富的基础类别。在1.x 时代,老实說控件的开发模式并没有太严谨的规则,设计师只要满足最基础的要求,继承至System.Web.UI.Control 或是System.ComponentModel.Component 就能够撰写控件与组件,虽然这给了设计师高度的自由,但也间接的加重组件设计师的工作量,例如撰写资料感知控件(Data Bound Control)这种很常見的想法,每个设计师硬是得先弄清楚DataSource 与DataField 属性该如何与IDE Designer 互动,然后再撰写特定的ControlDesigner 才能完成这样的控件。为了日后不再重新撰写这些变动率低、又常用到的程序代码,有经验的设计师就会架构自己的一群基础类别。在2.0,这件事不用勞设计师费心了,ASP.NET Team 已经为常用、可制式化的控件建立一群基础类别,现在要建立一个资料感知控件,设计师只要继承至DataBoundControl 即可,不需撰写ControlDesigner 了,要建立复合式控件也只要继承至CompositeControl 就行了,这个设计不但简化了设计师的工作,同时也为控件设计模式定下一个基本的标准,可以让初学者更容易上手,让设计师将时间花费在组件真正的功能上。
Adapter Model
Adapter Model 首次出现于ASP.NET Mobile Controls 中,当时主要的设计概念是为了让ASP.NET 网页能够适用于不同的行动装置,图1 是该设计的概念。图1 Mobile Controls
Adapter Model 采取Adapter 设计模式,将原本应该由Control 负责的Rending 动作交给另一个对象,也就是ControlAdapter 來完成,当要求到达服务器端时,ASP.NET 会判断客户端的装置类别,建立对应的ControlAdapter 來绘制控件,当然!在为了达到Rending 的动作前提下,除了真正的Rending 动作外,ControlAdapter 与Control 还建立了其它的通道,例如不同的Rending 动作需要有不同的Initialize 动作,也可能需要不同的Pre-Rending 动作,因此ControlAdapter 中定义了一群与Control 几乎相同的函式,如Init、PreRender、Render 等等。在ASP.NET 2.0 中,Adapter Model 已经被整合入Control 类别中,现在设计师可以为所有的控件建立ControlAdapter,不再仅限于Mobile Control。这个设计的目的分成远景与近需,近的是为了解决不同浏览器需要使用不同的HTML&JavaScript來绘制控件,远的是为了让Mobile与PC共享一个网页,当然!实务上这是很难达到的。
Base Control Classes
那到底有多少基础类别供我们应用呢?图2 列出目前笔者所观察到的类别。图2 ASP.NET 2.0 的控件基础类别Control 与WebControl 都是组件设计师熟悉的类别,接下來的DataSourceControl 是ASP.NET 2.0 新引入的Data-Binding 技术所用的基础类别,在2.0 中,DataSet 已经被SqlDataSource、AccessDataSource、OracleDataSource 等DataSource Control 所取代,而她们的基础类别就是DataSourceControl。BaseDataBoundControl 就是先前所提及的资料感知控件的基础类别,她提供了预定义的DataSourceID 属性,并为设计师预先建构了专属的ControlDesigner,因此只要继承至此类别,设计师只需专心撰写控件的程序代码,不须再耗费时间处理IDE 的相关细节。DataBoundControl 是更具体化些的基础类别,除了原有的DataSourceID 之外,另外还提供了DataMember 属性,她应该是最常用的资料感知控件基础类别,其子嗣CompositeDataBoundControl 则是用于复合式资料感知组件,如DetailsView、FormView及GridView的基础类别都是源自于此,HierarchicalDataBoundControl 是另一个支线,她是TreeView、Menu 的基础类别。最后一个基础类别是CompositeControl,用于撰写简单、不含资料感知能力的复合式控件。
Base Control Designer Classes
基础类别除了提供一致的实作标准外,更好的是她们预先配备了标准的ControlDesigner 來处理IDE 细节,图3 是这些基础类别所配备的基础ControlDesigner 。。图3 ASP.NET 2.0 的控件基础ControlDesigner 读者们应该可以由名称來对应出那个基础类别所用的ControlDesigner。
Designer Actions