ASP.NET MVC3 在 ASP.NET MVC 1 和 2 的基础上,增加了大量的特性,使得代码更加简化,并且可以深度扩展。这篇文章提供包含在此次发布中的许多新特性的说明.
Razor 视图引擎
ASP.NET MVC3 带来了一种新的名为 Razor 的视图引擎,提供了下列优点:
- Razor 的语法简单且清晰,只需要最小化的输入
- Razor 容易学习,语法类似于 C# 和 VB
- Visual Studio 对于 Razor 提供了智能提示和语法着色
- Razor 视图不需要允许程序或者启动 Web 服务器就可以进行测试
Razor 现在提供了一些新的特征:
- @model 用来指定传到视图的 Model 类型
- @* * 注释语法
- 对于整个站点可以一次性设定默认项目,例如布局。
- Html.Raw 方法提供了没有进行 HTML 编码的输出
- 支持在多个视图之间共享代码 ( _viewstart.cshtml 或者 _viewstart.vbhtml )
Razor 还包含新的 HTML Helper,例如:
- Chart. 生成图表
- WebGrid, 生成数据表格,支持完整的分页和排序
- Crypto,使用 Hash 算法来创建 Hash 和加盐的口令
- WebImage, 生成图片
- WebMail, 发送电子邮件
支持多视图引擎
在 ASP.NET MVC3 中,增加视图的对话框中允许你选择你希望的视图引擎,在新建项目对话框中,你可以指定项目默认的视图引擎,可以选择 WebForm,Razor,或者开源的视图引擎,例如:Spark, NHaml, 或者 NDjango.
控制器的改进
全局的 Action 过滤器
有的时候你希望能够在在一个 Action 方法执行之前或者执行之后执行一些处理逻辑,在 ASP.NET MVC2 中,提供了 Action过滤器,允许对特定控制器的 Action 方法进行处理,实际上,有时候你希望对所有的 Action 都进行类似的处理,MVC3允许你将过滤器加入到 GlobalFilters 集合中来创建全局的过滤器.
新的 ViewBag 属性
MVC2 中的控制器支持 ViewData 属性,允许通过后绑定的字典将数据传送给视图模板,在 MVC3 中,你可以通过 ViewBag来更加简单的完成。例如,对于 ViewData["Message"] = "text",你可以通过 ViewBag.Message ="text" 来完成。你不需要通过类来定义任何强类型的属性,因为这是动态属性,在内部,ViewBag 属性以名-值对的形式保存在ViewData 字典中。注意,在许多预发布版本中,这个属性被称为 ViewModel。
新的 ActionResult 类型
下面的 ActionResult 类型在 MVC3 中是新增的或者被扩展的。
- HttpNotFoundResult. 向客户端返回 404 HTTP 状态.
- RedirectResult. 基于一个布尔型的参数,返回一个临时的重定向 (HTTP 302 status code) 或者持久的重定向 (HTTP 301 status code), 结合这个改进,, Controller 提供了三个方法来支持持久的重定向: RedirectPermanent, RedirectToRoutePermanent, 和 RedirectToActionPermanent. 这些方法返回一个 Permanent 属性为真的 RedirectResult 对象实例。
- HttpStatusCodeResult. 返回用户指定的 HTTP 状态码。
JavaScript 和 Ajax 改进
默认情况下,在 MVC3 中,Ajax 和验证使用不引人注目的 unobtrusive 的 JavaScript 方式。unobtrusive不会在 HTML 中插入行内的 JavaScript ,这使得 HTML 更加精简和更少干扰,也使得更加容易被替换和定制 JavaScript库,在 MVC3 中,验证助手默认使用 jQuery.Validate 插件完成,如果你希望使用 MVC2 的行为,你可以在web.config 中通过配置来关闭 unobtrusive .
默认启用了客户端验证
在早先版本的 MVC 中,你需要在视图中显式调用 Html.EnableClientValidation 方法来启用客户端验证。在 MVC3 中,已经不再需要了,因为默认就会启用客户端验证。可以在 web.config 中关闭。
为了使得客户端验证工作,你仍然需要在网站中加入对 jQuery 和 jQuery.Validation 库的引用,你可以在自己的网站中提供,或者使用 Microsoft 或者 Google 的 CDN 服务器。
远程验证
ASP.NET 3 通过一个新的标签 RemoteAttribute 对 jQuery Validation 插件的远程验证提供支持。这允许客户端的验证库自动调用一个你定义在服务器上的自定义的方法来完成只能在服务器上完成的验证逻辑。
在下面的例子中,Remote 标签指定了通过一个定义在 UsersController 中名为 UserNameAvailable 的方法来验证用户名字段。
- public class User
- {
- [Remote("UserNameAvailable", "Users")]
- public string UserName { get; set; }
- }
下面的代码定义在控制器中
- public class UsersController
- {
- public bool UserNameAvailable(string username)
- {
- if(MyRepository.UserNameExists(username))
- {
- return "false";
- }
- return "true";
- }
- }
关于 Remote 属性的更多资源,参考 How to: Implement Remote Validation in ASP.NET MVC http://msdn.microsoft.com/en-us/library/gg508808(VS.98).aspx
JSON 绑定支持
ASP.NET MVC3 包含内置的 JSON 绑定支持,允许 Action 方法接收 JSON 编码的数据并且模型化为Action 的参数。这个能力经常被用于客户端的模板和数据绑定中。客户端模板允许你通过客户端的模板来格式化和显示一个或者多个数据,MVC3允许你简单的连接客户端模板和服务器端的 Action 方法,通过 JSON 来发送和接收数据,更多的信息参考:Scott Guthrie'sMVC 3 Preview blog post.