我觉得ASP.NET设计得最好的地方,就是控件树的概念。虽然WebForm的概念很烂,误导了不少没有Web开发经验的程序员,但它带来的控件这一概念及控件树结构就真的很好。
控件树优秀的地方,就在于它把整个页面的处理逻辑分割到控件,控件与控件之间是松耦合的,不存在任何依存关系。以往的Web开发,所有的代码都是平板式的接受Request平板式的输出Response,Request被看作由不同的Request属性组成,Response被看作不同的Response片断,而这些由平板式的代码混合在一起处理,导致Request属性和Response片断之间的耦合度很大。而在ASP.NET中,一个控件就只取它需要的Request属性,然后对它输出的Response片断负责,那样就相当于解耦了。
如果两个控件之间存在一定的逻辑,这些逻辑就应该交给一个可信赖的第三方统一管理。一般情况下,这个第三方是父控件,因为父控件有权统一管理子控件的行为,所以子控件之间的交互逻辑也可以交由父控件处理。另一种方法是通过专门的控件负责,例如WebPart之间的逻辑(WebPartConnection)统一由ConnectionsZone管理。控件间逻辑集中在一个地方,统一管理,需要时统一根据涉及控件的存在性判断丢弃该部分逻辑或者抛出异常,这还算是一定程度上的松耦合度。
有很多ASP.NET的新手,特别是有ASP经验的,一上来就喜欢用Response.Write输出一些无法用控件输出的信息,其实这是不对的,任何一类信息都应该由专门负责的对象负责输出,如果不存在该类对象你就要自己制作一个负责此类逻辑的类。用Response.Write输出debug信息是常见错误,实际上应该开启Trace然后用Trace.Write或者Trace.Warn来输出debug信息。用Response.Write输出script也是很多人在用的方法,实际上应该用Page.ClientScript下面的RegisterClientScriptBlock等专用script注册函数。至于输出的是HTML的话,则绝对不应该用Response.Write了,如果没有任何控件能实现你要的输出逻辑,就自己写一个,按照自己的逻辑写Render,Render就是专门给你书写自己的局部HTML输出逻辑的地方,而且在Render中你最好用HtmlTextWriter的特有方法来输出HTML,因为那样做能够比较容易将Render的代码迁移到别的Mark-up Language输出环境。
没有评论:
发表评论