这些看起来有点像ASP.NET 2.0中的供给者模式(provider model),但它更进了一步-完全进入了MVC框架的核心。从第10章起,你将会了解到各种各样的组件,并且知道为什么要调整或替换它们。
(三) 对HTML代码和HTTP的严密控制力(Tight Control over HTML and HTTP)
ASP.NET MVC知道产生整洁、符合标准的标记的重要。它内置的HTML helper方法的输出完全符合标准,但同Web Forms相比较其更多的重要变化体现在其设计哲学上。以往你对Web Forms自动生成的一大堆令人作呕的封装的HTML标记只有很小的控制权,作为替代,MVC框架鼓励你使用CSS设计简洁、优雅的标记。
当然,如果你想在你的页面摆上一些现成的复合UI元素的小玩意,像日历或级联菜单,ASP.NET MVC中的“无特殊要求”的标记方法让你可以轻易的使用最好的UI库,比如JQuery或雅虎的YUI库。微软已经把JQuery内置为ASP.NET MVC默认项目模板的一部分,JavaScript程序员会对ASP.NET MVC和当前流行的JQuery库结合如此紧密感到欣慰,甚至在微软自己的内容分发网络(CDN)服务器上你都可以直接引用Jquery.js文件。我们将在第20章涉及到JQuery。
ASP.NET MVC生成的页面不包含任何视图状态数据,因此它们比典型的ASP.NET Web Forms页面会小数百K。尽管今天的宽带连接已经非常快了,但这种带宽的节约依然会给最终用户带来巨大的体验改善。
和Ruby on Rails一样,ASP.NET MVC和HTTP合作和谐。你对往返于浏览器和服务器之间请求拥有完整的控制权,这样你就按你的喜好可以微调你的用户体验。AJAX现在实现起来很简单,而且没有任何影响客户端状态的自动回发。关注Web开发领域的任何开发者几乎肯定会发现,ASP.NET MVC会极大减少工作量,在同样的时间内完成的任务会更加令人满意。
(四) 易测试性
MVC使你在应用程序的可维护和可测试方面迈出了一大步,因为你可以自然的根据程序要实现的不同功能将其分离成许多不同的、相互独立的软件块。然而,ASP.NET MVC的设计师们并不满足于到底就止步了。为了支持单元测试,他们在框架中引入了面向组件设计的概念,并确保每个分离的代码块都以满足单元测试和模拟工具的需要的形式构建。
出于为开发者考虑的角度,他们还在Visual Studio向导中增加了创建单元测试向导,它可以使用许多开源的单元测试工具,如NUnit和xUnit,甚至微软自己的MSTest。即使你以前从来没有写过单元测试代码,你也会有一个良好的开始。
本书中,你会看许多为ASP.NET MVC控制器(controller)和行为(action)编写的简洁、简单的单元测试示例,这些示例会使用各种测试和模拟策略来冒充框架组件的实现,以确定实际运行中可能出现的任何情况。
易测试性不只是体现在单元测试中,ASP.NET MVC应用程序和UI自动化测试工具之间工作也非常好。你可以模拟用户交互的情景编写测试脚本,再不用去猜测HTML元素的结构,使用的CSS类,或者框架将要生成的ID,也用不着担心页面的结构会出现莫名其妙的变化。
(五) 强大的路由系统
URL的风格伴随着Web应用技术的发展也在不断发展。像下面的URL:
/App_v2/User/Page.aspx?action=show%20prop&prop_id=82742
将会逐渐稀少,它将被一种简单的、整洁的格式所代替,就像下面的这个:
/to-rent/chicago/2303-silver-street
之所以关注URL的结构问题,有以下几个很好的原因:第一,搜索引擎给在URL中搜索关键字分配了很大的权重。搜索“芝加哥的租金”会更容易匹配上面那个简单的URL。第二,现在许多网络用户的理解能力足够搞明白一个URL的意思,而且他们很欣赏在浏览器地址栏输入地址时的智能导航选项。第三,当人们理解了一个URL的结构,他们更有可能去链接它,把它和朋友共享,甚至可以通过电话大声的读出来。第四,它不会把你的应用程序的技术细节,目录,文件名结构公开到整个互联网上,因此,你可以自由的改变底层的实现而不会影响到你已经拥有的连接。
早期的框架难以实现精准的URL,不过ASP.NET MVC默认使用System.Web.Routing命名空间很容易提供精准的URL。它可以让你控制你的URL的样式,并将其和你的应用相关联,为你提供创造一个有意义的、对用户有用的地址样式的自由,不需要遵守预定义的模式。另外,只要你愿意,你完全可以容易的定义时髦的REST风格的URL样式。你会第11章看到一个详细的路由方案和关于URL的最佳练习。
(六) 构建于ASP.NET平台最好的部分之上
微软现有的ASP.NET平台已经为开发实用和高效的web应用程序提供了一整套成熟的、久经考验的组件和工具集。