ASP.NET MVC3 概要
ASP.NET MVC3 在ASP.NET MVC 1 和2 的基础上,增加了大量的特性,使得代码更加简化,并且可
以深度扩展。
• Razor 视图引擎
• 支持多视图引擎
• Controller 改进
• JavaScript 和Ajax
• Model 验证的改进
• 依赖注入Dependency Injection 的改进
• 其他新特性
Razor 视图引擎
ASP.NET MVC3 带来了一种新的名为Razor 的视图引擎,提供了下列优点:
• Razor 的语法简单且清晰,只需要最小化的输入
• Razor 容易学习,语法类似于C# 和VB
• Visual Studio 对于Razor 提供了智能提示和语法着色
• Razor 视图不需要允许程序或者启动Web 服务器就可以进行测试
Razor 现在提供了一些新的特征:
• @语法
• @{}语法
• @if(...){...}
• @RanderBody() 调用:@{Layout="~/Views/Shared/Main.cshtml"}
• @RanderSection("menu",optional:true) 调用:@section menu{...}
• @helper ProductListing(List<Product>products){<ul>@foreach(){<li></li>}</ul>}
调用:ProductListing(Model products)
• @model 用来指定传到视图的Model 类型@Html.TextBoxFor(m=>m.ProductName)
• @* *@ 注释语法
• Html.Raw 方法提供了没有进行HTML 编码的输出
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 插件完成,
默认启用了客户端验证
在早先版本的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";
}
}
JSON 绑定支持
ASP.NET MVC3 包含内置的JSON 绑定支持,允许Action 方法接收JSON 编码的数据并且模型化为
Action 的参数。这个能力经常被用于客户端的模板和数据绑定中。客户端模板允许你通过客户端的模板来
格式化和显示一个或者多个数据,MVC3 允许你简单的连接客户端模板和服务器端的Action 方法,通过
JSON 来发送和接收数据
Model 验证的改进
DataAnnotations 元数据标签
ASP.NET MVC3 支持DataAnnotations 元数据标签,例如:DisplayAttribute。
ValidationAttribute 类
在.NET Framework4 中被改进的ValidationAttribute 类支持新的IsValid 重载,提供关于当前验
证上下文的更多信息,例如什么对象被验证了。这允许你基于Model 的其他属性来验证当前值,例如,
新的CompareAttribute 就允许你比较Model 的两个属性的值,在下面的例子中,ComparePassword
属性必须匹配Password 字段来同通过验证。
public class User
{
[Required]
public string Password { get; set; }
[Required, Compare("Password")]
public string ComparePassword { get; set; }
}
验证接口
IValidatableObject 接口允许执行Model 水平的验证,并且允许你提供整个模型状态的验证错误信息,
或者基于Model 的两个属性。当Model 绑定的时候,MVC3 从IValidatableObject 接收错误信息,
在视图中使用内建的HTML 助手时,将会自动标识或者高亮受影响的字段。
IClientValidatable 接口允许ASP.NET MVC 在运行时发现支持的客户端验证器,这个接口被用来支持
集成不同的验证框架。
依赖注入Dependency Injection 的改进
ASP.NET MVC3 提供了更好的DI 和IoC 支持,在下面的地方支持DI:
控制器(registering and injecting controller factories, injecting controllers).
视图(registering and injecting view engines, injecting dependencies into view pages).
Action 过滤器(locating and injecting filters).
Model 绑定器(registering and injecting).
Model 验证提供器(registering and injecting).
Model 元数据提供器(registering and injecting).
Value 提供器(registering and injecting).
MVC3 支持Common Service Locator 库和任何支持这个库的IServiceLocator 接口的DI 容
器。也支持新的容易集成到DI 框架的IDependencyResolver 接口。
其他新特性
NuGet 集成
ASP.NET MVC3 自动安装和启用NuGet ,NUGet 是免费开源的一个包管理器,使得在你的项目中容
易发现,安装,和使用.NET 库。它可以和所有的Visual Studio 项目类型一起工作,包括ASP.NET
WebForm 和MVC。
NuGet 允许开发者维护开源项目,例如,像Moq 项目,NHibernate 等等,可以注册它们到一个在线
的网站中。
部分页的输出缓存
ASP.NET MVC 从版本1 开始支持整页缓存,MVC3 还提供了部分页缓存。这可以允许你容易地缓存输
出的一个区域或者片断,过滤器实现。
在请求验证中的粒度控制
ASP.NET MVC 内建了请求验证机制来自动帮助处理类似跨站攻击和HTML 注入等等。实际上,有时你
希望能够显式关闭请求的验证,例如你希望允许用户提交HTML 内容,例如在内容管理系统中,现在你
可以通过增加AllowHtml 标签到Model 或者视图的Model 来支持在绑定的时候基于一个属性关闭请
求验证。
脚手架的改进
MVC3 中的脚手架对于主键提供了更好的支持,例如,脚手架的模板不会将主键加入的编辑表单中了。
默认情况下,创建和编辑的脚手架现在使用Html.EditorFor 助手来替代Html.TextBoxFor 助手,这个
改进在增加视图对话框生成一个视图的时候,支持模型中的元数据标签。
对于Html.LabelFor 和Html.LabelForModel 的新重载
对于LabelFor 和LabelForModel 增加了新的方法重载,允许指定或者重写Label 文本。
无Session 的控制器支持
MVC3 中可以指定控制器是否使用Session 状态,进而,Session 是否是读写还是只读。
新的AdditionalMetadataAttribute 类
可以通过AdditionalMetadataAttribute 标签对Model 的一个属性访问
ModelMetadata.AdditionalValues 字典,例如,如果模型的某个属性仅仅支持管理员显示,你可以
如下设置:
public class ProductViewModel
{
[AdditionalMetadata("AdminOnly", true)]
public string RefundCode {get; set;}
}
系统的Filter
1、AcceptVerbs AcceptVerbs AcceptVerbs AcceptVerbs
规定页面的访问形式,如
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Example(){
return View();
}
页面只能以Post 形式访问,即表单提交。
2、ActionName ActionName ActionName ActionName
规定Action 的名称。
应用场景:如果不想用方法名做为Action 名,或Action 名为关键字的话,如
[ActionName("class")]
public ActionResult Example(){
return View();
}
3、NonAction NonAction NonAction NonAction
[OutputCache(Duration = 60, VaryByParam = "*")]
public ActionResult Example()
{
return View();
}
4、ValidateInput ValidateInput ValidateInput ValidateInput
该Action 可以接受Html 等危险代码(ASP.NET MVC 在aspx 中设置<%@ Page 的属性无
法完成等
同任务。)
[ValidateInput(false)]
public ActionResult Example()
{
return View();
}
以深度扩展。
• Razor 视图引擎
• 支持多视图引擎
• Controller 改进
• JavaScript 和Ajax
• Model 验证的改进
• 依赖注入Dependency Injection 的改进
• 其他新特性
Razor 视图引擎
ASP.NET MVC3 带来了一种新的名为Razor 的视图引擎,提供了下列优点:
• Razor 的语法简单且清晰,只需要最小化的输入
• Razor 容易学习,语法类似于C# 和VB
• Visual Studio 对于Razor 提供了智能提示和语法着色
• Razor 视图不需要允许程序或者启动Web 服务器就可以进行测试
Razor 现在提供了一些新的特征:
• @语法
• @{}语法
• @if(...){...}
• @RanderBody() 调用:@{Layout="~/Views/Shared/Main.cshtml"}
• @RanderSection("menu",optional:true) 调用:@section menu{...}
• @helper ProductListing(List<Product>products){<ul>@foreach(){<li></li>}</ul>}
调用:ProductListing(Model products)
• @model 用来指定传到视图的Model 类型@Html.TextBoxFor(m=>m.ProductName)
• @* *@ 注释语法
• Html.Raw 方法提供了没有进行HTML 编码的输出
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 插件完成,
默认启用了客户端验证
在早先版本的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";
}
}
JSON 绑定支持
ASP.NET MVC3 包含内置的JSON 绑定支持,允许Action 方法接收JSON 编码的数据并且模型化为
Action 的参数。这个能力经常被用于客户端的模板和数据绑定中。客户端模板允许你通过客户端的模板来
格式化和显示一个或者多个数据,MVC3 允许你简单的连接客户端模板和服务器端的Action 方法,通过
JSON 来发送和接收数据
Model 验证的改进
DataAnnotations 元数据标签
ASP.NET MVC3 支持DataAnnotations 元数据标签,例如:DisplayAttribute。
ValidationAttribute 类
在.NET Framework4 中被改进的ValidationAttribute 类支持新的IsValid 重载,提供关于当前验
证上下文的更多信息,例如什么对象被验证了。这允许你基于Model 的其他属性来验证当前值,例如,
新的CompareAttribute 就允许你比较Model 的两个属性的值,在下面的例子中,ComparePassword
属性必须匹配Password 字段来同通过验证。
public class User
{
[Required]
public string Password { get; set; }
[Required, Compare("Password")]
public string ComparePassword { get; set; }
}
验证接口
IValidatableObject 接口允许执行Model 水平的验证,并且允许你提供整个模型状态的验证错误信息,
或者基于Model 的两个属性。当Model 绑定的时候,MVC3 从IValidatableObject 接收错误信息,
在视图中使用内建的HTML 助手时,将会自动标识或者高亮受影响的字段。
IClientValidatable 接口允许ASP.NET MVC 在运行时发现支持的客户端验证器,这个接口被用来支持
集成不同的验证框架。
依赖注入Dependency Injection 的改进
ASP.NET MVC3 提供了更好的DI 和IoC 支持,在下面的地方支持DI:
控制器(registering and injecting controller factories, injecting controllers).
视图(registering and injecting view engines, injecting dependencies into view pages).
Action 过滤器(locating and injecting filters).
Model 绑定器(registering and injecting).
Model 验证提供器(registering and injecting).
Model 元数据提供器(registering and injecting).
Value 提供器(registering and injecting).
MVC3 支持Common Service Locator 库和任何支持这个库的IServiceLocator 接口的DI 容
器。也支持新的容易集成到DI 框架的IDependencyResolver 接口。
其他新特性
NuGet 集成
ASP.NET MVC3 自动安装和启用NuGet ,NUGet 是免费开源的一个包管理器,使得在你的项目中容
易发现,安装,和使用.NET 库。它可以和所有的Visual Studio 项目类型一起工作,包括ASP.NET
WebForm 和MVC。
NuGet 允许开发者维护开源项目,例如,像Moq 项目,NHibernate 等等,可以注册它们到一个在线
的网站中。
部分页的输出缓存
ASP.NET MVC 从版本1 开始支持整页缓存,MVC3 还提供了部分页缓存。这可以允许你容易地缓存输
出的一个区域或者片断,过滤器实现。
在请求验证中的粒度控制
ASP.NET MVC 内建了请求验证机制来自动帮助处理类似跨站攻击和HTML 注入等等。实际上,有时你
希望能够显式关闭请求的验证,例如你希望允许用户提交HTML 内容,例如在内容管理系统中,现在你
可以通过增加AllowHtml 标签到Model 或者视图的Model 来支持在绑定的时候基于一个属性关闭请
求验证。
脚手架的改进
MVC3 中的脚手架对于主键提供了更好的支持,例如,脚手架的模板不会将主键加入的编辑表单中了。
默认情况下,创建和编辑的脚手架现在使用Html.EditorFor 助手来替代Html.TextBoxFor 助手,这个
改进在增加视图对话框生成一个视图的时候,支持模型中的元数据标签。
对于Html.LabelFor 和Html.LabelForModel 的新重载
对于LabelFor 和LabelForModel 增加了新的方法重载,允许指定或者重写Label 文本。
无Session 的控制器支持
MVC3 中可以指定控制器是否使用Session 状态,进而,Session 是否是读写还是只读。
新的AdditionalMetadataAttribute 类
可以通过AdditionalMetadataAttribute 标签对Model 的一个属性访问
ModelMetadata.AdditionalValues 字典,例如,如果模型的某个属性仅仅支持管理员显示,你可以
如下设置:
public class ProductViewModel
{
[AdditionalMetadata("AdminOnly", true)]
public string RefundCode {get; set;}
}
系统的Filter
1、AcceptVerbs AcceptVerbs AcceptVerbs AcceptVerbs
规定页面的访问形式,如
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Example(){
return View();
}
页面只能以Post 形式访问,即表单提交。
2、ActionName ActionName ActionName ActionName
规定Action 的名称。
应用场景:如果不想用方法名做为Action 名,或Action 名为关键字的话,如
[ActionName("class")]
public ActionResult Example(){
return View();
}
3、NonAction NonAction NonAction NonAction
[OutputCache(Duration = 60, VaryByParam = "*")]
public ActionResult Example()
{
return View();
}
4、ValidateInput ValidateInput ValidateInput ValidateInput
该Action 可以接受Html 等危险代码(ASP.NET MVC 在aspx 中设置<%@ Page 的属性无
法完成等
同任务。)
[ValidateInput(false)]
public ActionResult Example()
{
return View();
}