记得数年前,当ASP.NET刚出现时,天下间Web开发框架中似乎出现了一个“巨人”,WebForms这种似 乎人人都能掌握的开发框架几乎瞬间流行起来。如果谁还在用传统ASP这种控制与表现混合的开发方式, 似乎立即变得低俗了许多。于是乎许许多多人都学会了拖控件+绑定的方式,“Web开发人员”也越来越多 ,一片红火,好不热闹。
风水轮流转,不知从什么时候开始Rails框架随着RoR忽的流行了开来,.NET社区也出现了Monorail, 批判WebForms声音也慢慢多了起来。如今微软自己也推出了基于ASP.NET平台的MVC框架,很多WebForms的 反对者似乎更加自信了:连微软自己都抛弃了WebForms,证明WebForms的确该退出历史舞台了,也听到了 一些类似于“WebForms不适合Web开发已经是公认的事实”这样“无比肯定”的话。先不说微软推出MVC到 底是不是意味着它抛弃了WebForms,单从那些MVC追捧者们“念念不忘”的WebForms的缺点上来看,我认 为他们大部分只是在“跟风”,就和当年许许多多人追捧WebForms一样。
不过我必须承认,我对ASP.NET MVC的了解仅限于Scott Gu博客上所写的内容,至今还没有下载过 ASP.NET 3.5 Extensions CTP。而对于RoR和Monorail也仅限于一些资料和示例,从来没有写过一行代码 。按照我的“标准”,我自己是没有资格评论MVC框架的优劣的。不过我还是想写这篇文章,因为我只会 WebForms平反,而不会“贬低”MVC框架;我只是想证明WebForms的那些缺点到底真的是缺点,还是开发 人员自身没有好好利用起这把利器。因此我将会根据我的经验,一一回应对WebForms比较常见的指责。如 果措辞上有任何的不妥,也请大家多多包涵。
我下面提到的做法,都是在经过实际开发过程检验的(例如开发人员与美工的合作),可能不是最佳 ,但是我认为还是不错的。
一、ViewState
HTTP是无连接无状态的协议,因此ASP.NET中提出了ViewState的概念,这样数据被重新Post回页面时 ,页面(控件)的状态就能恢复,因此才有了很多丰富的功能,例如一些复杂的控件事件。但是 ViewState带来的问题就是,如果使用不当,那么页面体积就会增加许多,网络中传输的数据太多自然会 影响性能。
但是ViewState真是必须的吗?我可以很负责任地说,在如今大部分Web应用的页面中,出现的几乎都 是大量的链接,点击链接就会跳转到一个和当前页面完全无关的新页面,这样的话,页面上的ViewState 又有什么用?因此我如果新建一个Web项目,做的第一件事情就是去Web.config中将enableViewState从全 局关闭——同时关闭的还有enableSessionState,这也是影响性能的因素之一(stateless也便于做Web服 务器层面的负载均衡)。
有人曾经反驳我,关闭了ViewState,用WebForm还有什么意义?我的答案是:意义多的很。WebForm提 供了控件模型,我能够使用“人人都能看懂和编写”的方式来设置或读取一个文本框里的值。我能轻松地 响应不同按钮的事件来编写触发各种业务逻辑。这就是意义,WebForms的开发还是非常简单而清晰的(在 一定程度上吧,不要“滥用”永远是正确的)。
嗯?刚才不是说只有保持ViewState才能使用控件的事件吗?没有ViewState怎么从控件中重新获取状 态呢?请注意我之前所说的是“复杂事件”。什么是复杂事件?TextBox的TextChange事件就是“复杂事 件”,GridView的Command事件也是复杂事件,但是Button的Click事件就是“简单事件”;与此相对的, GridView里的每一行的数据每一个子控件的状态是“复杂状态”,而TextBox的Text属性则是“简单状态 ”。“复杂状态”和“复杂事件”需要ViewState,因为与之有关的这些“控件”是ASP.NET“无中生有” 的,但是“简单事件”和“简单状态”基于页面中“必然”会提交的数据,它们自然能够还能够使用。在 我的ASP.NET开发过程中,使用的几乎都是“简单事件”和“简单状态”,而印象中放弃“复杂事件”和 “复杂状态”并没有给我带来任何的困扰。
当某人送给我们10件礼物,而其中只有4件是我需要的,那么为什么不能简单地放弃其余6件,偏偏要 去感谢只送给我们3件礼物的人而去指责前者呢?要知道他并没有恶意,那多余的6件也没有给我们造成任 何困扰。
但人就是那么奇怪。