天天看点

《精通 ASP.NET MVC 3 框架(第三版)》----第1章 设计思路 1.1 Web开发简史

本节书摘来自异步社区《精通 asp.net mvc 3 框架(第三版)》一书中的第1章,第1节,作者: 【美】adam freeman , steven standerson,译者: 林逸 , 李萍 , 更多章节内容可以访问云栖社区“异步社区”公众号查看。

精通 asp.net mvc 3 框架(第三版)

asp.net mvc是微软研发的web开发框架,它整合了“模型—视图—控制器(mvc)”架构的高效与整洁,敏捷开发中最新的思想与技术,以及当前asp.net平台的精华部分。asp.net mvc可以完全替代传统的asp.net web form,除了一些微不足道的web小项目,在各种web开发项目中它都具有明显的优势。在本章中,你将了解微软当初创建asp.net mvc的原因,与它的前辈和替代品之间的区别,以及asp.net mvc 3的新特性。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

要理解asp.net mvc的特色及其设计目标,有必要考察一下web开发的历史。近年来,微软的web开发平台演变得越加强大,如表1-1所示,每一个新平台都修正了它前一版本中的不足。

《精通 ASP.NET MVC 3 框架(第三版)》----第1章 设计思路 1.1 Web开发简史

cgi 是web服务器与返回动态内容的任意可执行程序进行连接的一种标准方法。其规范由美国国家超级计算应用中心(ncsa)维护。

asp.net在2002年刚问世时,给web开发领域带来了巨大的转变。图1-1描述了当时微软的技术堆栈。

《精通 ASP.NET MVC 3 框架(第三版)》----第1章 设计思路 1.1 Web开发简史

(注:此图的含义为,web form建立在asp.net之上,而asp.net又建立在.net平台之上,mvc所起的作用是替代这里的web form。——译者注)

作用于将用户界面(ui)模拟为服务器端控件对象层的办法,微软试图利用web form把http(具有无状态本质)和html(当时许多开发人员尚不熟悉)都隐藏起来。每个控件在请求期间都跟踪自己的状态(通过view state),在需要时把自己渲染成html,并自动地将客户端事件(如按钮点击)与相应的服务器端事件处理代码相关联。结果,web form被设计成在web上传递传统的事件驱动式gui(图形用户界面)的一个巨大的抽象层。

其思想是,让web开发在感觉上与windows form开发相同。开发者不再需要以一系列独立的http请求和响应进行工作,可以认为它是一种状态化的ui。我们可以忘记web及其无状态本质,转而用一种“拖—放”式设计器来创建ui,并假想或至少假装,所有事情都发生在服务器上。

传统的asp.net web form开发曾是一种了不起的思想,但事实证明它更加复杂。随着时间的推移,web form在实际项目中显现出了一些缺陷:

视图状态负荷:跨请求状态维护的实际机制(称为视图状态)导致在客户端与服务器之间传输大块数据。这种数据即使在最适度的web应用程序中也达到几百kb,而且它来回于每次请求之间,以很长的响应时间令网站访问者不悦,且增加了服务器的带宽需求。

页面生命周期:连接客户端事件与服务器端事件处理代码的机制(是页面的部分生命周期)格外复杂和棘手。很少有开发者在不产生视图状态错误或不发现某些事件处理程序莫明失效的情况下,能够在程序运行期间成功地维护控件层。

关注分离的错误理解:asp.net的后台代码模型提供了一种手段,把应用程序代码从它的html标记中提取出来,并放到一个独立的后台代码类中。这种逻辑与表现的分离曾得到了广泛的赞许,但在实际应用中,却又鼓励开发者在这些怪异的后台代码类中把表现代码(如操纵服务器端控件树)与它们的应用程序逻辑(如维护数据库数据)混在一起。最终结果是脆弱和难以理解的。

html上的受限控制:服务器控件将自己渲染成html,但并不是你所希望的那种必要的html。在asp.net 4之前,这种html输出通常不符合web标准,或不能很好地使用css。而且,服务器控件会生成不可预知且复杂的id值,结果,这些id难以用javascript进行访问。这些问题在asp.net 4中减少了,但仍然不容易得到你所期望的html。

遗漏抽象:web form试图尽可能地隐去html和http。当你试图实现自定义行为时,时常需要放弃抽象,这迫使你需要反过来开发回传的事件机制,或采取笨拙的方法,以使它生成所希望的html。再则,这种抽象可能对有能力的web开发者构成一个极大的障碍。

低可测试性:asp.net的设计者们恐怕未曾预料到,自动测试会成为软件开发的重要组成部分。因此,他们设计的这种紧耦合体系结构不适合单元测试也就不足为奇了。集成测试也很具挑战性。

asp.net一直在不断改进,版本2.0添加了一组标准的应用程序组件,可以减少开发者需要编写的代码量。2007年发布的ajax是微软对web 2.0/ajax疯狂时代的回应,它支持富客户端交互,同时也简化了开发者的工作。最新版的asp.net 4能够生成更易于预测且与标准兼容的html标记,但依然存在许多内在的局限性。