This article is currently in the process of being translated into Chinese (~50% done).
ASP.NET MVC vs. Web Forms
ASP.NET 框架的第一个版本是在2002年发布的,与之附带的是 Web Forms 视图引擎,而且只有这一种视图引擎。之后,为了支持 MVC 这类东西,微软拓展了 ASP.NET 框架,使其可以支持多种视图引擎。但多年以来,如果你曾使用 ASP.NET 框架,那也就意味着你同时也使用了 Web Forms。
Microsoft had a very commendable goal when they created Web Forms: They wanted to abstract as much of the gritty details of the HTTP protocol and the stateless nature of it away and make web development feel much more like developing a Windows application, which was already a pretty pleasant experience at the time.
They did so by introducing the ViewState, which would make sure that the current state of any form was preserved during post backs to the server and they did it with server controls, which encapsulated the rendering of HTML and CSS into an arbitrary control which you could customize using logical properties instead of being forced to mix HTML and CSS directly.
他们也引入了基于事件驱动的模型,当时的 Windows 开发者都熟知这点。该模型允许开发者响应真实的事件。例如,一个按钮被点击或一个CheckBox的值正在被改变,而无需在每次页面加载后,手动对这些控件的状态进行检查。这也意味着,前端的标记代码和后端代码是分离的,理论上来说这点很不错。
Web Form 的败笔
对于很多开发者来说,Web Forms 是一缕新鲜的空气,它也帮助了许多新人开发者与一些只熟悉 Windows 应用程序开发的开发者来学习构建 Web 应用程序。很不幸的是,微软没能将抽象层做得完美无瑕,因为一系列问题很快接踵而至。其中一部分问题在后续版本中得到了修复,而其它的一些问题与 Web Form 的基本工作原理有关(也就是说,它本身存在一些硬伤),因此非常难以被改变。Web Forms 技术饱受以下几点原因所诟病:
ViewState 使页面更重了
为了追踪页面上每一个服务端控件的状态,就需要用到 ViewState 字符串。那么,每次请求都会导致 ViewState 字符串被传回服务器,然后再由服务器传出去。由此可见,Web Form 的页面体量就会变得很重了。如果你正在构建一个中等复杂度的页面,ViewState 结果字符串就能达到几百 KB。这将导致页面的加载时间变长,尤其是使用手机对页面进行访问时。随着全世界访问网站的手机数量增加,这是一个非常现实的问题。
服务端控件限制了你对其输出的HTML代码的控制权
服务端控件使你能够很容易地创建一些有用的东西,但你永远都没法控制它所渲染出来的HTML代码。当你需要微调你的前端代码时,或者你面临了浏览器兼容性问题时,这点就成为了一个难题。
Web Form 对自动化测试非常不友好
Web Form 模型是在自动化测试/单元测试壮大之前被引入的。当自动化测试与单元测试壮大起来之后,很容易看出来 Web Form 很难(如果硬说不是不可能的话)进行有效的单元测试。
ASP.NET MVC 比 Web Form 有所增强之处
ASP.NET MVC 删除了很多由 Web Form 实现的抽象层。例如,通常情况下都是由你自己来生成 HTML 代码,而不再是依赖于服务端控件。而且你也不用再获取 ViewState 了,有效地解决了 ViewState 使页面变重的问题(也会同时使一些服务端控件,例如 GridView 和 Repeater 渲染无效)。
由于不同层级之间的松耦合,MVC 模型完美适配自动化测试/单元测试。
你应该选择哪种技术?
在阅读本文上方的内容时,你会觉得 Web Form 就像是已经过时了的技术。这里我要重点强调一下——实际上 Web Form 并不是过时技术。Web Form 仍在被微软活跃地开发,Asp.Net Web Form也依然是你踏入 Web 开发世界的一种可能的选择。尤其是当你想做点什么,然后在短时间内就能让它运行起来的时候。有大量的高级服务端控件可以帮你轻松地完成一些急活。不过代价就是,你不能全部手写你自己的 HTML 前端代码。
如果你已经了解了如何使用 Web Form,你绝对需要尝试一下 ASP.NET MVC,尤其是如果上述所提到的 Web Form 的一些痛点也正在深深地困扰着你时。如果你是 Web 开发新人,并且正在这两种技术中二选一的话,我的建议还是让你试一下 ASP.NET MVC。MVC 模型对于一些人来说是具有一定制约性的,并且,在一开始就遵从一种模式很显然是比不遵从难很多的。不过一旦你适应了它,使用 MVC 模型进行开发工作是非常愉快的。从 MVC 模型收获的用户关注度来看,这种愉快的感觉并不会在之后消失掉。(意思就是习惯了之后,很多人都爱上了 MVC 模型)
总结
如果你是新人 Web 开发者,我想说的是——尽管 ASP.NET Web Form 更容易上手,你也应该先试试 ASP.NET MVC。不过不要担心,本系列教程将帮助你开始学习MVC,并通过开发你的第一个 ASP.NET MVC 程序这个过程来引导你学习。