[转:http://www.cnblogs.com/Klesh/archive/2007/10/13/webform-and-monorail.html]
本文所指WebForm,特指Microsoft在.NET平台上倡导的类似WinForm的组件式开发方式,所有Controller特指MonoRail里的Controller非MVC里的Controller。
WebForm的开发理念源自于WinForm,基于控件的拖放及后台代码编写的开发方式的而且确是很方便快捷的开发方法,WinForm的成功很好地说明了这一点。整个WebForm的核心就是控件,以封装手,重用为目的而存在的控件使得WebForm极为容易上手。得力于WebForm方便快捷的开发方式,.NET在企业开发领域取得了巨大成功。
HTTP协议是无状态,WebForm为了要像WinForm那样保持控件的状态,不得不依赖于ViewState/Postback这些机制。总的来说,WebForm是以控件为核心,依赖于ViewState、Postback机制最终构成的。脱离了它们,WebForm则不能称之为WebForm。
然而,控件在带来方便的同时,其生成的HTML代码也难以维护;ViewState带来状态维护的方便,同时也造成了性能的损耗;在Postback机制中有一点让我很困惑的是:很多时候我们要在Page_Load判断是否第一次请求然后执行一些初始化(如绑定的动作)。为何Microsoft不在Page上加多一个Initialize之类的事件来代替现有的在Page_Load中判断IsPostback。这样做一来会比较优雅,二来也更加像WinForm了。
再来看看aspx和cs,它们是WebForm表现和代码分离的形式,是的,仅仅只是表现和代码的分离而已。aspx上面的控件依赖于后台cs的控制,而后台的cs则依赖于aspx的存在。分离是物理上的,逻辑上它们还是紧密地结合在一起的,没有了谁都不行。专业点来说,它们是耦合在一起的。
在企业开发领域,由于软件将会在企业内部有限范围内使用,通常则不会对界面有太高要求,甚至大多数时候都是开发人员直接拼出来的界面。因此,WebForm生成的代码再恶心,再难以维护,aspx/cs耦合再严重也没什么影响。ViewState/Posback带来的性能损耗在使用人数有限的企业应用中也并不突出。所以用WebForm来代替一部份企业CS(Client/Server)应用好处是很明显的,比如说,系统更新时只需更新服务器,而不用每次分发客户端。
可是,毕竟不是所有使用.NET的人都在做企业开发,当用WebForm来做网站开发,我感觉就像牛刀杀鸡一般。在网站开发的世界里,我们的客人,通常会对界面会有所要求,甚至于有时候会要求生成的HTML代码要符合W3C标准……所以,对HTML代码的控制变得重要起来;另一方面,作为放在internet上供众人浏览的网站,ViewState/Posback带来的性能开销变得不容忽视起来;aspx/cs耦合使得无法将它们作为设计师和程序员职责分离的承载体(特别是当程序员在页面上扔一些SqlDataSource之类的控件)。
牛刀不是不能杀鸡,但很多人毕竟不习惯用牛刀来杀鸡。MVP(Model-View-Presenter)才是真正切合网站开发实际情况的开发方式。虽然WebForm比MonoRail要强大,很多,但它毕竟不适合我们做网站开发的。
MonoRail就是适合网站开发的一套MVP开发框架。与WebForm的开发理念不同,它着重于职责的分离。当Controller(MonoRail中的Presenter称为Controller)和View被切割隔离开来时,设计师和程序员和谐地分工合作也成为了可能(世事无绝对)。MVP的理念中,没有控件,没有Posback,当然也没有ViewState,客户端和服务器间的交流回归到了原始的Form/QueryString/Cookie的方式(难道这样不是更自然吗?),借由此,设计师重新找回了对HTML代码的控制权。程序员在Controller里专注于数据的处理,设计师(我通常认为设计师应该具有一定的html知识)通过学习简单的模板控制代码后,模板文件则会成为他的势力范围。
Contoller和View之间会通过松散的PropertyBag进行沟通,而不像WebForm的asp/cs那样紧密(cs会对aspx上的控件在在引用,或aspx上的控件会绑定cs产生的数据)。因此,View对呈现的逻辑有绝对的控制权,而单纯的View上的修改调整也不会对Controller产生影响。即使设计师把View全删光了,程序也不会出错,那么,你就再也不必为设计师的过失而背黑锅了。而本来应该由设计师完成的修改也不需要程序员来做了。
无论是WebForm也好,MonoRail也好,最大的区别还是它们的理念。其实,只要你有好的意识,使用WebForm一样也可以把界面和控制分离得很好;相反,在MonoRail的Controller里一样可以生成HTML代码再传给View……
追加两个分别用WebForm和MonoRail实现购物车功能的Demo