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 发布
- Scott Hanselman:ASP.NET MVC3、WebMatrix、NuGet、IIS Express 和 Orchard 发布 - 上下文中的 Microsoft 1 月 Web 发布
- Scott Guthrie:宣布发布 ASP.NET MVC 3、IIS Express、SQL CE 4、Web Farm Framework、Orchard、WebMatrix
- ASP.NET MVC 3 发行说明
安装和帮助
- 使用 Web 平台安装程序安装 ASP.NET MVC 3 (推荐)
- 使用安装程序可执行文件安装 ASP.NET MVC 3
- 安装 ASP.NET MVC 3 for Visual Studio 11 开发人员预览版
- 阅读 ASP.NET MVC 3 简介教程
- 在论坛中获取帮助并讨论 ASP.NET MVC 3
ASP.NET MVC 3 基于 ASP.NET MVC 1 和 2 构建,添加了出色的功能,可简化代码并允许更深入的扩展性。 本主题概述了此版本中包含的许多新功能,分为以下部分:
- 使用 MvcScaffold 集成的可扩展基架
- 已启用 HTML 5 的项目模板
- Razor 视图引擎
- 支持多视图引擎
- 控制器改进
- JavaScript 和 Ajax
- 模型验证改进
- 依赖项注入改进
- 其他新功能
如果你对框架完全不熟悉,新的基架系统可以更轻松地开始高效使用;如果你经验丰富并且已经知道自己在做什么,则可以自动执行常见开发任务。
这受名为 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,甚至 JET 和 ODBCDirect)创建基架(如果你如此偏向的话!
有关 ASP.NET MVC 3 中的基架的详细信息,请参阅以下资源:
Steve Sanderson 的帖子系列,包括:
Scott Hanselman 的帖子来自他的 PDC 2010 会话 构建博客与 Microsoft “未命名的 Web 爱包”
“新建项目”对话框包含启用项目模板 HTML 5 版本的复选框。 这些模板利用 Modernizr 1.7 为下层浏览器中的 HTML 5 和 CSS 3 提供兼容性支持。
ASP.NET MVC 3 附带名为 Razor 的新视图引擎,可提供以下优势:
- Razor 语法简洁明了,需要最少的击键次数。
- Razor 易于学习,部分原因是它基于 C# 和 Visual Basic 等现有语言。
- Visual Studio 包括 IntelliSense 和 Razor 语法的代码着色。
- 可以对 Razor 视图进行单元测试,而无需运行应用程序或启动 Web 服务器。
一些新的 Razor 功能包括:
@model
用于指定要传递给视图的类型的语法。@* *@
注释语法。- 指定默认 (的功能,例如
layoutpage
为整个网站) 一次。 - 用于
Html.Raw
在不对文本进行 HTML 编码的情况下显示文本的方法。 - 支持 (_viewstart.cshtml 或 _viewstart.vbhtml 文件) 的多个视图之间共享代码。
Razor 还包括新的 HTML 帮助程序,如下所示:
Chart
. 呈现图表,提供与 ASP.NET 4 中的图表控件相同的功能。WebGrid
. 呈现具有分页和排序功能的数据网格。Crypto
. 使用哈希算法创建经过适当加盐和哈希处理的密码。WebImage
. 呈现图像。WebMail
. 发送电子邮件。
有关 Razor 的详细信息,请参阅以下资源:
- 斯科特·古斯里介绍 Razor 的博客文章
- Scott Guthrie's blog post introducing the @model keyword
- Scott Guthrie 的博客文章介绍了 Razor 布局
- Razor API 快速参考
- MVC 3 发行说明
ASP.NET MVC 3 中的 “添加视图 ”对话框允许您选择要使用的视图引擎,使用“ 新建项目 ”对话框可以为项目指定默认视图引擎。 可以选择 (ASPX) 、Razor 或开源视图引擎(如 Spark、NHaml 或 NDjango)的Web Forms视图引擎。
有时需要在操作方法运行之前或操作方法运行之后执行逻辑。 为了支持此功能,ASP.NET MVC 2 提供了操作筛选器。 操作筛选器是自定义属性,提供声明性方法,用于将操作前和操作后行为添加到特定的控制器操作方法。 但是,在某些情况下,你可能希望指定适用于所有操作方法的操作前或操作后行为。 MVC 3 允许通过将全局筛选器添加到集合来 GlobalFilters
指定全局筛选器。 有关全局操作筛选器的详细信息,请参阅以下资源:
MVC 2 控制器支持属性 ViewData
,该属性使你能够使用后期绑定字典 API 将数据传递到视图模板。 在 MVC 3 中,还可以对 属性使用更简单的语法 ViewBag
来实现相同的目的。 例如,可以编写 ,而不是编写 ViewData["Message"]="text"
ViewBag.Message="text"
。 无需定义任何强类型类就可以使用 ViewBag
属性。 由于它是动态属性,因此可以改为获取或设置属性,它会在运行时动态解析它们。 在内部, ViewBag
属性以名称/值对的形式存储在字典中 ViewData
。 (注意:在 MVC 3 的大多数预发行版本中, ViewBag
属性被命名为 ViewModel
property.)
MVC 3 中新增或增强了以下 ActionResult
类型和相应的帮助程序方法:
- HttpNotFoundResult。 向客户端返回 404 HTTP 状态代码。
- RedirectResult。 根据布尔参数) 返回临时重定向 (HTTP 302 状态代码) 或永久重定向 (HTTP 301 状态代码。 结合此更改, Controller 类现在有三种用于执行永久重定向的方法:
RedirectPermanent
、RedirectToRoutePermanent
和RedirectToActionPermanent
。 这些方法返回 的实例RedirectResult
,Permanent
并将 属性设置为true
。 - HttpStatusCodeResult。 返回用户指定的 HTTP 状态代码。
默认情况下,MVC 3 中的 Ajax 和验证帮助程序使用不显眼的 JavaScript 方法。 不显眼的 JavaScript 可避免将内联 JavaScript 注入 HTML。 这使得 HTML 更小、更简洁,并更易于交换或自定义 JavaScript 库。 MVC 3 中的验证帮助程序也默认使用 jQueryValidate
插件。 如果需要 MVC 2 行为,可以使用 web.config 文件设置禁用不显眼的 JavaScript。 有关 JavaScript 和 Ajax 改进的详细信息,请参阅以下资源:
- 维基百科网站上不显眼的 JavaScript 基本简介
- Brad Wilson 的不显眼的 JavaScript 文章
- Brad Wilson 的不显眼的 JavaScript 验证文章
- 使用 Razor 和非引人注目的 JavaScript (教程创建 MVC 3 应用程序 ASP.NET 站点)
- MVC 3 发行说明
在早期版本的 MVC 中,需要从视图中显式调用 Html.EnableClientValidation
方法,以便启用客户端验证。 在 MVC 3 中,不再需要此操作,因为默认情况下启用了客户端验证。 (可以使用web.configfile.)
为了使客户端验证正常工作,仍需要在站点中引用相应的 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 中实现远程验证 。
ASP.NET MVC 3 包括内置的 JSON 绑定支持,使操作方法能够接收 JSON 编码的数据,并将它绑定到操作方法参数。 此功能在涉及客户端模板和数据绑定的方案中非常有用。 (客户端模板使你能够使用在 client 上执行的模板格式化和显示单个数据项或一组数据项。) MVC 3 使你能够轻松地将客户端模板与发送和接收 JSON 数据的服务器上的操作方法连接起来。 有关 JSON 绑定支持的详细信息,请参阅 Scott Guthrie 的 MVC 3 预览版博客文章的JavaScript 和 AJAX 改进部分。
ASP.NET MVC 3 支持 DataAnnotations
元数据属性,例如 DisplayAttribute
。
ValidationAttribute
.NET Framework 4 中对 类进行了改进,以支持新的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 支持 Common Service Locator 库和支持该库接口 IServiceLocator
的任何 DI 容器。 它还支持新的 IDependencyResolver
接口,以便更轻松地集成 DI 框架。
有关 MVC 3 中的 DI 的详细信息,请参阅以下资源:
ASP.NET MVC 3 会在安装过程中自动安装和启用 NuGet。 NuGet 是一个免费的开源包管理器,可用于在项目中轻松查找、安装和使用 .NET 库和工具。 它适用于所有 Visual Studio 项目类型, (包括 ASP.NET Web Forms 和 ASP.NET MVC) 。
NuGet 使维护开放源代码项目的开发人员 (例如 Moq、NHibernate、Ninject、StructureMap、NUnit、温莎、RhinoMocks 和 Elmah) 来打包其库并将其注册到联机库中。 然后,对于想要使用这些库之一来查找包并将其安装在他们正在处理的项目中的 .NET 开发人员来说,就很容易了。
通过 ASP.NET 3 工具更新,项目模板包括 JavaScript 库预安装的 NuGet 包,因此可通过 NuGet 进行更新。 Entity Framework Code First 也预装为 NuGet 包。
有关 NuGet 的详细信息,请参阅 NuGet 文档。
ASP.NET 自版本 1 起,MVC 一直支持整页响应的输出缓存。 MVC 3 还支持部分页输出缓存,使你能够轻松缓存响应的区域或片段。 有关缓存的详细信息,请参阅 Scott Guthrie 关于 MVC 3 候选版本的博客文章的部分页面输出缓存部分和 MVC 3 发行说明的子操作输出缓存部分。
ASP.NET MVC 具有内置的请求验证,可自动帮助防止 XSS 和 HTML 注入攻击。 但是,有时你想要显式禁用请求验证,例如,如果想要让用户发布 HTML 内容 (例如,在博客条目或 CMS 内容) 。 现在可以向模型或视图模型添加 AllowHtml 属性,以便在模型绑定期间基于每个属性禁用请求验证。 有关请求验证的详细信息,请参阅以下资源:
- Scott Guthrie 关于 MVC 3 候选发布的博客文章中的“不显眼的 JavaScript 和验证”部分。
- MVC 3 发行说明
在 ASP.NET MVC 3 中,可以将项目模板、视图引擎和单元测试项目框架添加到“ 新建项目 ”对话框。
与早期版本的 MVC 相比,ASP.NET MVC 3 基架模板在识别模型上的主键属性并对其进行适当处理方面做得更好。 (例如,基架模板现在确保主键不会作为可编辑的表单字段进行基架。)
默认情况下,创建和编辑基架现在使用 Html.EditorFor
帮助程序而不是 Html.TextBoxFor
帮助程序。 当 “添加视图 ”对话框生成视图时,这改进了对数据注释属性形式的模型元数据的支持。
为 LabelFor
和 LabelForModel
帮助程序方法添加了新的方法重载。 通过新的重载,可以指定或替代标签文本。
在 ASP.NET MVC 3 中,可以指示是否希望控制器类使用会话状态,如果是,则会话状态应为读/写还是只读。 有关无会话控制器支持的详细信息,请参阅 MVC 3 发行说明。
可以使用 AdditionalMetadata 属性填充模型属性的 ModelMetadata.AdditionalValues
字典。 例如,如果视图模型具有应仅向管理员显示的属性,则可以批注该属性,如以下示例所示:
public class ProductViewModel
{
[AdditionalMetadata("AdminOnly", true)]
public string RefundCode {get; set;}
}
呈现产品视图模型时,此元数据可供任何显示或编辑器模板使用。 由你来解释元数据信息。
Internet 项目模板中的 AccountController 已得到很大的改进。
包含新的 Intranet 项目模板,用于启用 Windows 身份验证并删除 AccountController。