ASP.NET MVC 是微软官方提供的以 MVC 模式为基础的 ASP.NET Web Application 框架,它由 Castle 的 MonoRail 而来,最新版本 ASP.NET MVC 4.0。MVC(Model、View、Controller)将一个Web应用分解为:Model、View和Controller。ASP.NET MVC 框架提供了一个可以代替ASP.NET WebForm的基于 MVC 设计模式的应用。
MonoRail 的核心是 Action Pack 在 .NET上的实现,是一个 .NET 的 MVC Web 开发框架,原名 Castle On Rails,是 CastleProject 的一个子项。MonoRail 的开发模式和传统 WebForm有很大区别。WebForm 属于 PageController 模式,每一个页面对应一个 Controller,通常情况下,这个 Controller 就是 URL。System.WebUI.Page 实现了 IHttpHandler,与每个 aspx 相关的类都各自处理自己的 http 请求, 经一些逻辑处理后,输出自己的视图;而 MonoRail 是 FrontController 模式,由 Castle.MonoRail.Framework.MonoRailHttpHandler 接管所有请求,然后根据请求的 URL 创建相应的 Controller,Controller 再调用相应的 action,最后调用模板引擎输出内容。默认情况下,一个URL 结构是 Controller/action,例如 http://localhost/monorailSample/Home/index.rails 对应类 HomeController的 Index() 方法。
ASP.NET MVC 主要有四种视图引擎。最新的 Razor 引擎(WebPages),其他三种是传统的 ASPX(WebForms)、Spark 和 NHaml。
最新的视图引擎 Razor,从 Asp.net MVC 3 版本引入, 支持Unit Test,很容易上手。虽然它与前面的模板系统有些共性,但和我们前面讨论的三种视图引擎截然不同。不同于 NHaml,Razor 仍然使用 XML 标记;又不同于 Spark,Razor 使用 XML 代码方面没有走得那么极端;也不完全类似于 ASPX,它把那些比较笨重的占位符 <%= %> 和 <%: %> 替换成 @ 符号,不需要特殊的结束标记,代码很简练。
默认情况下,从 @ 表达式生成的所有文本都是HTML编码过的【译注:从而防止XSS攻击】。@块里面的文本可以包含多个"HTML内容块"。当识别出任意的XML标签,Razor就会切换回HTML模式,跟传统ASP开发人员使用"%> html代码 <%="的技巧非常相似。如果你实际不希望XML标签切换回HTML模式,你可以使用< text>作为一个占位符。
Razor 使用现有的 VB 或 C# 语法。任何文本编辑器都可以用来编辑Razor文件,而 VS 2010 加入对 Razor 文件智能提示的完全支持。
Razor 的另一个重要特点是它与单元测试框架的兼容性。Razor 模板不需要 Controller 或 Web 服务器作为宿主(host),所以用它写出来的视图应该是充分可测的。对于 ASPX,虽然理论上一 切皆可测试,但实际上却是相当困难;而其他两个引擎在各自的网站上面甚至都没有真正提到可测试性。
四个视图引擎都支持母版页的概念。对于把视图预编译进 Assembly 文件,ASPX 只提供了部分支持,而 Razor 和 Spark 都是完全支持。NHaml 目前把这项还是放在需求特性的列表上面。特别有趣的是,Razor 和 Spark 预编译出的视图可以用在无宿主的场景下,比如邮件合并引擎。
此外,还有 Hasic 、Bellevue、NVelocity、Brail 和 SharpTiles。Hasic 是一个用VB.NET's XML literals的Asp.net MVC 引擎;Bellevue 是一个Asp.net MVC框架的开源模板原形,以HTML为其核心没有其它更多的语法;NVelocity 需要学习VTL语法,使用很简单,特别是很多Java程序员已经熟悉Velocity。简单的语法也强迫程序员把逻辑和界面很好的分离开来,方便跟美工配合;Brail 是移植自MonoRail项目。基于Boo的模板引擎,Boo是一种语法类似 Python 的 .NET 语言。据 MonoRail 的参考说,Brail引擎是功能最强、性能最好的选择,但Boo是一种陌生的语言,这成了Brail引擎应用的最大障碍。MonoRail推荐使用的模板引擎是NVelocity,但说不定哪天Brail会赶上来;SharpTiles 是一个基于构建于ASP.NET MVC和Monorail框架的模板View Engine. 它的理念是部分移植自JSTL与Tiles框架。