ASP.NET MVC 3

(包括 2011 年 4 月工具更新)

ASP.NET MVC 3 是一个框架,用于使用成熟的设计模式和 ASP.NET 和 .NET Framework 的强大功能构建可缩放、基于标准的 Web 应用程序。

它与 ASP.NET MVC 2 并排安装,因此立即开始使用!

在此处下载 安装程序

热门功能

  • 通过 NuGet 可扩展集成基架系统
  • 已启用 HTML 5 的项目模板
  • 包含新 Razor 视图引擎的表达视图
  • 具有依赖注入和全局动作过滤器的强大钩子
  • 具有非干扰性 JavaScript、jQuery 验证和 JSON 绑定的丰富 JavaScript 支持
  • 阅读下面的完整功能列表

ASP.NET MVC 3 中的新增功能

安装和帮助

ASP.NET MVC 3 概述

ASP.NET MVC 3 基于 ASP.NET MVC 1 和 2 生成,添加了可简化代码并允许更深入扩展的出色功能。 本主题概述了此版本中包括的许多新功能,这些新功能组织到以下部分:

使用 MvcScaffold 集成的可扩展基架

新的基架系统使完全没有使用框架经验的用户可以更轻松地理解并开始使用,而对于那些有经验且已经熟悉这个过程的用户而言,这个系统可以自动执行常见的开发任务。

这由名为 MvcScaffolding 的新 NuGet 基架包支持。 许多软件技术都使用术语“基架”来表示“快速生成可编辑和自定义的软件的基本大纲”。 我们为 ASP.NET MVC 创建的基架包在几种方案中非常有用:

  • 如果你第一次学习 ASP.NET MVC,因为它为你提供了一种快速的方法来获取一些有用的工作代码,然后你可以根据需要进行编辑和调整。 它帮你摆脱盯着空白页面而不知从何下手的困扰!
  • 如果了解 ASP.NET MVC,并且现在正在探索一些新的附加技术 ,例如对象关系映射器、视图引擎、测试库等,因为该技术的创建者可能也为其创建了基架包。
  • 如果你的工作涉及重复创建某种类型的类似类或文件,因为你可以创建自定义基架,用于输出测试装置、部署脚本或其他所需的任何内容。 团队中的每个人都可以使用你的自定义脚手架。

MvcScaffolding 中的其他功能包括:

  • 支持 C# 和 VB 项目
  • 支持 Razor 和 ASPX 视图引擎
  • 支持将基架集成到 ASP.NET MVC 区域,并使用自定义视图布局/主版页
  • 可以通过编辑 T4 模板轻松自定义输出
  • 可以使用自定义 PowerShell 逻辑和自定义 T4 模板添加全新的基架。 这些(以及你为其提供的任何自定义参数)会自动显示在控制台选项卡完成列表中。
  • 可以获取包含不同技术额外基架的 NuGet 包(例如,现在已经有一个用于 LINQ to SQL 的概念验证包),并将它们组合在一起。

ASP.NET MVC 3 工具更新包括对此基架系统的出色 Visual Studio 支持,例如:

  • “添加控制器”对话框现在支持对创建、读取、更新和删除控制器操作及其对应视图进行全自动脚手架搭建。 默认情况下,此框架通过 EF Code First 创建数据访问代码。
  • “添加控制器”对话框支持通过 NuGet 包(如 MvcScaffolding扩展基架。 这允许将自定义脚手架插入到对话框中,从而为其他数据访问技术(例如 NHibernate 或甚至使用 ODBCDirect 的 JET)创建脚手架,如果你有兴趣。

有关 ASP.NET MVC 3 中的基架的详细信息,请参阅以下资源:

HTML 5 项目模板

“新建项目”对话框包含一个复选框,用于启用 HTML 5 版本的项目模板。 这些模板利用 Modernizr 1.7 在下层浏览器中为 HTML 5 和 CSS 3 提供兼容性支持。

Razor 视图引擎

ASP.NET MVC 3 附带名为 Razor 的新视图引擎,可提供以下优势:

  • Razor 语法简洁明了,需要最少数量的击键。
  • Razor 易于学习,部分原因是它基于 C# 和 Visual Basic 等现有语言。
  • Visual Studio 包括适用于 Razor 语法的 IntelliSense 和代码着色。
  • 无需运行应用程序或启动 Web 服务器,即可对 Razor 视图进行单元测试。

一些新的 Razor 功能包括:

  • @model 用于指定传递给视图的类型的语法。
  • @* *@ 注释语法。
  • 为整个网站指定一次默认值(如 layoutpage) 的功能。
  • Html.Raw在不对文本进行 HTML 编码的情况下显示文本的方法。
  • 支持在多个视图之间共享代码(_viewstart.cshtml_viewstart.vbhtml 文件)。

Razor 还包括新的 HTML 帮助程序,例如:

  • Chart。 呈现图表,在 ASP.NET 4 中提供与图表控件相同的功能。
  • WebGrid。 呈现数据网格,其中包含分页和排序功能。
  • Crypto。 使用哈希算法创建适当加盐并经过哈希处理的密码。
  • WebImage。 渲染图像。
  • WebMail。 发送电子邮件。

有关 Razor 的详细信息,请参阅以下资源:

支持多个视图引擎

使用 ASP.NET MVC 3 中的 “添加视图 ”对话框可以选择要使用的视图引擎,使用 “新建项目 ”对话框可以为项目指定默认视图引擎。 可以选择 Web 窗体视图引擎(ASPX)、Razor 或开源视图引擎,例如 SparkNHamlNDjango

控制器改进

全局操作筛选器

有时,需要在操作方法运行之前或操作方法运行之后执行逻辑。 为此,ASP.NET MVC 2 提供了操作筛选器。 操作筛选器是自定义属性,提供声明性方法,用于将操作前行为和操作后行为添加到特定的控制器操作方法。 但是,在某些情况下,你可能想要指定适用于所有操作方法的操作前行为或后操作行为。 通过使用 MVC 3,您可以通过将全局筛选器添加到 GlobalFilters 集合中来指定它们。 有关全局操作筛选器的详细信息,请参阅以下资源:

新建“ViewBag”属性

MVC 2 控制器支持一种属性,该属性允许您使用延迟绑定字典 API 将数据传递到视图模板。 在 MVC 3 中,还可以对 ViewBag 属性使用更简单的语法来实现相同的目的。 例如,与其写入ViewData["Message"]="text",可以编写ViewBag.Message="text"。 无需定义任何强类型类才能使用该 ViewBag 属性。 因为它是动态属性,因此只需获取或设置属性,它将在运行时动态解析它们。 在内部, ViewBag 属性以名称/值对的形式存储在字典中 ViewData 。 (注意:在 MVC 3 的大多数预发行版本中,该 ViewBag 属性已命名为 ViewModel 该属性。

新的“ActionResult”类型

MVC 3 中新增或增强了以下 ActionResult 类型和相应的帮助程序方法:

  • HttpNotFoundResult。 向客户端返回 404 HTTP 状态代码。
  • RedirectResult。 根据布尔参数返回临时重定向(HTTP 302 状态代码)或永久重定向(HTTP 301 状态代码)。 结合此更改, 控制器 类现在有三种方法用于执行永久重定向: RedirectPermanentRedirectToRoutePermanent以及 RedirectToActionPermanent。 这些方法返回一个RedirectResult实例,其Permanent属性设置为true
  • HttpStatusCodeResult。 返回用户指定的 HTTP 状态代码。

JavaScript 和 Ajax 改进

默认情况下,MVC 3 中的 Ajax 和验证帮助程序使用不显眼的 JavaScript 方法。 无干扰的 JavaScript 可避免将内联 JavaScript 注入 HTML。 这使得 HTML 更小、更混乱,并且更易于交换或自定义 JavaScript 库。 MVC 3 中的验证帮助程序也默认使用 jQueryValidate 插件。 如果需要 MVC 2 行为,可以使用 web.config 文件设置禁用非干扰 JavaScript。 有关 JavaScript 和 Ajax 改进的详细信息,请参阅以下资源:

默认情况下启用 Client-Side 验证

在早期版本的 MVC 中,需要从视图中显式调用 Html.EnableClientValidation 该方法才能启用客户端验证。 在 MVC 3 中,由于默认启用客户端验证,因此不再需要这样做。 (可以使用 web.config 文件中的设置禁用此设置。

若要使客户端验证正常工作,仍需引用站点中的相应 jQuery 和 jQuery 验证库。 可以在自己的服务器上托管这些库,也可以从内容分发网络(CDN)(例如来自 Microsoft 或 Google 的 CDN)引用这些库。

远程验证程序

ASP.NET MVC 3 支持新的 RemoteAttribute 类,使你能够利用 jQuery 验证插件的远程验证程序支持。 这使客户端验证库能够自动调用在服务器上定义的自定义方法,以便执行只能执行服务器端的验证逻辑。

在以下示例中,该Remote属性指定客户端验证将调用在类上UserNameAvailable命名UsersController的操作以验证UserName字段。

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 属性的详细信息,请参阅如何:在 MSDN 库中 的 ASP.NET MVC 中实现远程验证

JSON 绑定支持

ASP.NET MVC 3 包括内置的 JSON 绑定支持,使操作方法能够接收 JSON 编码的数据,并将数据模型绑定到操作方法参数。 此功能适用于涉及客户端模板和数据绑定的方案。 (使用客户端模板,可以使用在客户端上执行的模板来格式化和显示单个数据项或一组数据项。使用 MVC 3,可以轻松地将客户端模板与发送和接收 JSON 数据的服务器上的操作方法连接。 有关 JSON 绑定支持的详细信息,请参阅 Scott Guthrie MVC 3 预览版博客文章的JavaScript 和 AJAX 改进部分。

模型验证改进

“DataAnnotations”元数据属性

ASP.NET MVC 3 支持 DataAnnotations 元数据属性,例如 DisplayAttribute

“ValidationAttribute”类

在 .NET Framework 4 中,对ValidationAttribute类进行了改进,以支持一个新的IsValid重载,该重载能够提供关于当前验证上下文的更多信息,例如正在验证的对象。 这可实现更丰富的方案,你可以在其中基于模型的另一个属性验证当前值。 例如,使用新 CompareAttribute 属性可以比较模型两个属性的值。 在下面的示例中,该ComparePassword属性必须与Password字段匹配才能有效。

public class User
{ 
    [Required]
    public string Password { get; set; } 
    [Required, Compare("Password")] 
    public string ComparePassword { get; set; } 
}

验证接口

IValidatableObject 接口使你能够执行模型级验证,并使你能够提供特定于整个模型状态的验证错误消息,或者在模型中的两个属性之间提供验证错误消息。 MVC 3 现在在模型绑定时从 IValidatableObject 接口中检索错误,并使用内置 HTML 表单帮助程序自动标记或突出显示视图中受影响的字段。

IClientValidatable 接口允许 ASP.NET MVC 在运行时发现验证程序是否支持客户端验证。 此接口经过设计,以便它可以与各种验证框架集成。

有关验证接口的详细信息,请参阅 Scott Guthrie 的 MVC 3 预览版博客文章的“模型验证改进”部分。 但是,请注意,博客中对“IValidateObject”的引用应为“IValidatableObject”。

依赖注入改进

ASP.NET MVC 3 为应用依赖关系注入(DI)以及与依赖关系注入或控制反转(IOC)容器集成提供了更好的支持。 在以下方面添加了对 DI 的支持:

  • 控制器(注册和注入控制器工厂,注入控制器)。
  • 视图(注册和注入视图引擎,将依赖项注入视图页面)。
  • 动作筛选器(定位和注入筛选器)。
  • 模型绑定器(注册和注入)。
  • 模型验证提供程序(注册和注入)。
  • 模型元数据提供者(注册和注入)。
  • 值提供程序(注册和注入)。

MVC 3 支持 通用服务定位器 库以及支持该库 IServiceLocator 接口的任何 DI 容器。 它还支持一个新的 IDependencyResolver 接口,以便更轻松地集成 DI 框架。

有关 MVC 3 中的 DI 的详细信息,请参阅以下资源:

其他新功能

NuGet 集成

ASP.NET MVC 3 会自动安装并启用 NuGet 作为其设置的一部分。 NuGet 是一个免费的开源包管理器,可用于在项目中轻松查找、安装和使用 .NET 库和工具。 它适用于所有 Visual Studio 项目类型(包括 ASP.NET Web 窗体和 ASP.NET MVC)。

NuGet 使维护开源项目(例如 Moq、NHibernate、Ninject、StructureMap、NUnit、Windsor、RhinoMocks 和 Elmah)的开发人员能够打包其库并将其注册到在线画廊中。 然后,想要使用这些库之一的 .NET 开发人员可以轻松查找包,并将其安装在他们正在处理的项目中。

使用 ASP.NET 3 工具更新,项目模板包括预安装的 NuGet 包的 JavaScript 库,因此可以通过 NuGet 进行更新。 Entity Framework Code First 也预装为 NuGet 包。

有关 NuGet 的详细信息,请参阅 NuGet 文档

部分页面输出缓存

ASP.NET MVC 支持自版本 1 以来对完整页面响应的输出缓存。 MVC 3 还支持分页输出缓存,这允许你轻松缓存响应的区域或片段。 有关缓存的详细信息,请参阅 Scott Guthrie 博客文章中关于 MVC 3 发布候选版的 局部页面输出缓存部分,以及在MVC 3 发行说明中的 子操作输出缓存部分。

对请求验证的精细控制

ASP.NET MVC 具有内置的请求验证,可自动帮助防范 XSS 和 HTML 注入攻击。 但是,有时你想要显式禁用请求验证,例如,如果你希望允许用户发布 HTML 内容(例如,在博客条目或 CMS 内容中)。 现在可以向模型或视图模型添加 AllowHtml 属性,以便在模型绑定期间基于每个属性禁用请求验证。 有关请求验证的详细信息,请参阅以下资源:

可扩展“新建项目”对话框

在 ASP.NET MVC 3 中,可以将项目模板、视图引擎和单元测试项目框架添加到 “新建项目 ”对话框。

模板基架改进

ASP.NET MVC 3 的基架模板在识别模型的主键属性并正确处理它们方面,比 MVC 的早期版本做得更好。 (例如,基架模板现在确保主键不会作为可编辑的表单字段进行搭建。)

默认情况下,创建和编辑基架现在使用 Html.EditorFor 帮助程序而不是 Html.TextBoxFor 帮助程序。 这改进了在 “添加视图 ”对话框生成视图时以数据注释属性的形式对模型元数据的支持。

“Html.LabelFor”和“Html.LabelForModel”的新重载

LabelForLabelForModel帮助方法新增了方法重载。 新的重载使你能够指定或重写标签文本。

无会话控制器支持

在 ASP.NET MVC 3 中,可以指示是希望控制器类使用会话状态,如果是,会话状态是读/写还是只读。 有关无会话控制器支持的详细信息,请参阅 MVC 3 发行说明

新的“AdditionalMetadataAttribute”类

可以使用 AdditionalMetadata 属性填充模型属性的 ModelMetadata.AdditionalValues 字典。 例如,如果视图模型具有应仅向管理员显示的属性,则可以对该属性进行批注,如以下示例所示:

public class ProductViewModel 
{
    [AdditionalMetadata("AdminOnly", true)]
    public string RefundCode {get; set;}
}

呈现产品视图模型时,此元数据可用于任何显示或编辑器模板。 由你来解释元数据信息。

AccountController 的改进

Internet 项目模板中的 AccountController 得到了极大的改进。

新建 Intranet 项目模板

包含一个新的 Intranet 项目模板,用于启用 Windows 身份验证并删除 AccountController。