ASP.NET MVC 3 发行说明

概述

本文档介绍适用于 Visual Studio 2010 的 ASP.NET MVC 3 RTM 的发布。 ASP.NET MVC 是用于开发使用 Model-View-Controller (MVC) 模式的 Web 应用程序的框架。 ASP.NET MVC 3 安装程序包含以下组件:

  • ASP.NET MVC 3 运行时组件
  • ASP.NET MVC 3 Visual Studio 2010 工具
  • ASP.NET 网页运行时组件
  • ASP.NET 网页 Visual Studio 2010 工具
  • 适用于 .NET 的Microsoft 程序包管理器 (NuGet)
  • Visual Studio 2010 的更新,支持 Razor 语法。 (有关详细信息,请参阅 KnowledgeBase 文章2483190。

可在以下 URL 的 ASP.NET 网站上找到每个预发行版本的 ASP.NET MVC 3 的完整发行说明:

https://www.asp.net/learn/whitepapers/mvc3-release-notes

Installation Notes(SAP 支持说明 #1984787 - SUSE Linux Enterprise Server 12:安装说明)

若要使用 Web 平台安装程序 (Web PI) 安装 ASP.NET MVC 3 RTM,请访问以下页面:

https://www.microsoft.com/web/gallery/install.aspx?appid=MVC3

或者,可以从以下页面下载 ASP.NET MVC 3 RTM for Visual Studio 2010 的安装程序:

https://go.microsoft.com/fwlink/?LinkID=208140

ASP.NET MVC 3 可以安装,并且可以与 ASP.NET MVC 2 并行运行。

软件要求

ASP.NET MVC 3 运行时组件需要以下软件:

  • .NET Framework 版本 4。

    ASP.NET MVC 3 Visual Studio 2010 工具需要以下软件:

  • Visual Studio 2010 或 Visual Web Developer 2010 Express。

文档

MSDN 网站上提供了 ASP.NET MVC 的文档,URL 如下:

https://go.microsoft.com/fwlink/?LinkId=205717

ASP.NET 网站的 MVC 页面上提供了有关 ASP.NET MVC 的教程和其他信息,网址如下:

https://www.asp.net/mvc/

支持

这是完全受支持的版本。 有关获取技术支持的信息,请参阅Microsoft 支持部门网站

还可以随意将此版本的问题发布到 ASP.NET MVC 论坛,其中 ASP.NET 社区的成员经常能够提供非正式支持:

https://forums.asp.net/1146.aspx

将 ASP.NET MVC 2 项目升级到 ASP.NET MVC 3 工具更新

ASP.NET MVC 3 可以与同一台计算机上的 ASP.NET MVC 2 并排安装,这使你可以灵活地选择何时将 ASP.NET MVC 2 应用程序升级到 ASP.NET MVC 3。

若要手动将现有 ASP.NET MVC 2 应用程序升级到版本 3,请执行以下操作:

  1. 在计算机上创建新的空 ASP.NET MVC 3 项目。 此项目将包含升级所需的一些文件。

  2. 将以下文件从 ASP.NET MVC 3 项目复制到 ASP.NET MVC 2 项目的相应位置。 需要更新对 jQuery 库的任何引用,以考虑新文件名(jQuery-1.5.1.js):

    • /Views/Web.config
    • /packages.config
    • /scripts/*.js
    • /Content/themes/*.*
  3. 空 ASP.NET MVC 3 项目解决方案的根目录中的包 文件夹复制到解决方案的根目录中,该根位于解决方案.sln文件所在的目录中。

  4. 如果 ASP.NET MVC 2 项目包含任何区域,请将 /Views/Web.config 文件复制到 每个区域的 Views 文件夹。

  5. 在 ASP.NET MVC 2 项目中的两个 Web.config 文件中,全局搜索并替换 ASP.NET MVC 版本。 查找以下内容:

    System.Web.Mvc, Version=2.0.0.0
    

    将它替换为以下代码:

    System.Web.Mvc, Version=3.0.0.0
    
  6. 在解决方案资源管理器中,删除对 System.Web.Mvc(指向版本 2 中的 DLL)的引用,然后添加对 System.Web.Mvc(v3.0.0.0.0)的引用。

  7. 添加对System.Web.WebPages.dll和System.Web.Helpers.dll的引用。 这些程序集位于以下文件夹中:

    • %ProgramFiles%\ Microsoft ASP.NET\ASP.NET MVC 3\Assemblies
    • %ProgramFiles%\ Microsoft ASP.NET\ASP.NET 网页\v1.0\Assemblies
  8. 在解决方案资源管理器中,右键单击项目名称并选择“卸载项目”。 然后再次右键单击项目名称,然后选择“编辑 ProjectName.csproj”。

  9. 找到 ProjectTypeGuids 元素,并将 {F85E285D-A4E0-4152-9332-AB1D724D3325} 替换为 {E53F8FEA-EAE0-44A6-8774-FFD645390401}。

  10. 保存更改,右键单击项目,然后选择“重载项目”。

  11. 在应用程序的根 Web.config 文件中,将以下设置添加到 程序集 部分。

    <add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, 
         PublicKeyToken=31BF3856AD364E35" />
    
    <add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral,
         PublicKeyToken=31BF3856AD364E35" />
    
  12. 如果项目引用使用 ASP.NET MVC 2 编译的任何第三方库,请将以下突出显示的 bindingRedirect 元素添加到配置部分下的应用程序根目录中的 Web.config 文件中:

    <runtime>
       <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <dependentAssembly>
           <assemblyIdentity name="System.Web.Mvc"
               publicKeyToken="31bf3856ad364e35"/>
           <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0"/>
         </dependentAssembly>
       </assemblyBinding>
    </runtime>
    

ASP.NET MVC 3 工具更新中的更改

本部分介绍自 ASP.NET MVC 3 RTM 版本以来 ASP.NET MVC 3 工具更新版本中所做的更改。

“添加控制器”对话框现在可以为具有视图和数据访问代码的控制器搭建基架

基架是快速为应用程序生成控制器和视图的一种方式。 生成代码后,可以对其进行编辑以满足项目的要求。

若要在 ASP.NET MVC 3 中启动“添加控制器”对话框,请右键单击解决方案资源管理器中的“控制器”文件夹,单击“添加,然后单击“控制器”。 对话框已得到增强,可提供其他基架选项。

“添加控制器”对话框的屏幕截图。

默认情况下有三个基架模板可用。

空控制器

此模板生成一个空控制器文件。 此模板等效于不检查 “添加操作”,以便在早期版本的 ASP.NET MVC 中创建、编辑、详细信息和删除方案 。 如果选择此选项,则没有其他选项可用。

具有空读/写操作的控制器

此模板生成一个控制器文件,该文件包含所有必需的操作方法,但在方法中没有实现代码。 此模板等效于在早期版本的 ASP.NET MVC 中检查 “添加操作”以创建、编辑、详细信息、删除方案 。 如果选择此选项,则没有其他选项可用。

使用 Entity Framework 读取/写入操作和视图的控制器

使用此模板可以快速创建工作数据输入用户界面。 它生成处理一系列常见要求和方案的代码,例如:

  • 数据访问。 生成的代码读取和写入数据库中的实体。 如果选择现有数据上下文类,或者让模板生成新的 DbContext 类,则它适用于 Entity Framework Code First 方法。 如果选择现有的 ObjectContext 类,它还适用于 Entity Framework Database First 或 Model First 方法。

  • 验证。 生成的代码使用 ASP.NET MVC 模型绑定和元数据功能,以便根据模型类上声明的规则验证表单提交。 这包括内置验证规则,例如 RequiredStringLength 属性,以及自定义验证规则。

  • 一对多关系。 如果在模型类之间定义一对多外键关系,生成的代码将生成用于选择相关实体的下拉列表。 例如,可以定义以下模型类,这些模型类遵循 Entity Framework Code First 约定:

    public class Product
    {
         public int ProductId { get; set; }
         [Required]
         public string Name { get; set; }
    
         // Product belongs to Category
         public int CategoryId { get; set; }
         public virtual Category Category { get; set; }
    }
    public class Category
    {
         public int CategoryId { get; set; }
         [Required]
         public string Name { get; set; }
    }
    

    然后,为 Product 类搭建控制器基架时,其视图将允许用户为每个 Product 实例选择一个 Category 对象。

    此模板在“添加控制器”对话框中启用其他选项。 对于 Model 类,可以选择解决方案中的任何模型类,该类确定用户能够创建或编辑的数据类型:

  • 如果要首先使用 Entity Framework Code,可以选择任何模型类。

  • 如果使用 Entity Framework Database First 或 Entity Framework Model First,请确保选择在概念模型中定义的实体类。

对于 数据上下文类,可以做出以下选择:

  • 如果想要使用 Code First 且没有现有的数据上下文类,请选择“新建数据上下文”。 然后,将为你生成数据上下文类。
  • 如果要使用 Code First 并具有现有的数据上下文类,请在此处选择它。 它将更新为保留所选的模型类。
  • 如果使用 Database First 或 Model First,请在此处选择对象上下文类。

对于视图,请选择要使用的视图引擎,如果不想搭建任何视图的基架,请选择“无”。

可以选择“高级选项”,为生成的视图指定其他选项。 例如,可以选择要使用的布局或母版页。

“ASP.NET MVC 3 新建项目”对话框的改进

用于创建新 ASP.NET MVC 3 项目的对话框包括多项改进,如下所示。

“新建项目”对话框的屏幕截图。Intranet 应用程序图标和复选框“使用 H T M L 5 语义标记”突出显示。

新建“Intranet 项目”模板

项目模板列表包括新的 Intranet 应用程序模板。 此模板包含用于使用 Windows 身份验证 而不是表单身份验证生成 Web 应用程序的设置。 由于 Intranet 应用程序需要一些不能封装在项目模板中的 IIS 设置,因此该模板包含一个自述文件,其中包含有关如何使项目模板在 IIS 中工作的说明。 MSDN 网站上提供了新的 Intranet 应用程序模板的文档,URL 如下:

https://msdn.microsoft.com/library/gg703322(VS.98).aspx

项目模板现已启用 HTML5

“新建项目”对话框现在包含一个选项,用于向项目模板添加特定于 HTML5 的功能。 选择此选项会导致生成包含新 HTML5 <header><footer><navigation>元素的视图。

请注意,早期版本的浏览器不支持特定于 HTML5 的标记。 为了解决此限制,HTML5 项目模板包括对 Modernizr 库的引用。 (请查看下一部分。)

项目模板现在包括 Modernizr 1.7

Modernizr 是一个 JavaScript 库,可在尚不支持这些功能的浏览器中支持 CSS 3 和 HTML5。 此库作为预安装的 NuGet 包包含在 ASP.NET MVC 3 项目的模板中。 有关 Modernizr 的详细信息,请参阅 http://www.modernizr.com/

项目模板包括 jQuery、jQuery UI 和 jQuery 验证的更新版本

项目模板现在包括以下版本的 jQuery 脚本:

  • jQuery 1.5.1
  • jQuery 验证 1.8
  • jQuery UI 1.8.11

这些库作为预安装的 NuGet 包包含在内。

项目模板现在包括 ADO.NET Entity Framework 4.1 作为预安装的 NuGet 包

ADO.NET Entity Framework 4.1 包括 Code First 功能。 Code First 是 ADO.NET Entity Framework 的新开发模式,提供现有 Database First 和 Model First 模式的替代方法。

Code First 侧重于使用用 Visual Basic 或 C# 编写的 POCO 类(“普通旧 CLR 对象”)定义模型。 然后,可以将这些类映射到现有数据库,或者用于生成数据库架构。 可以使用 DataAnnotations 属性或使用 Fluent API 提供其他配置。

以下 URL 的 ASP.NET 网站上提供了有关使用 Code Firstwith ASP.NET MVC 的文档:

https://www.asp.net/mvc/tutorials/getting-started-with-mvc3-part1-cs https://www.asp.net/entity-framework/tutorials/creating-an-entity-framework-data-model-for-an-asp-net-mvc-application

项目模板包括作为预安装的 NuGet 包的 JavaScript 库

创建新的 ASP.NET MVC 3 项目时,该项目包括前面提到的 JavaScript 文件(例如,Modernizr 库),方法是使用 NuGet 安装它们,而不是直接将脚本添加到项目模板内容中的 Scripts 文件夹中。 这使你能够使用 NuGet 在发布新版本的脚本时将脚本更新到最新版本。

例如,鉴于新的 jQuery 版本的频率,项目模板中包含的 jQuery 版本将在某个时间点过期。 但是,由于 jQuery 作为已安装的 NuGet 包包含在内,因此在更新版本的 jQuery 可用时,会在 NuGet 对话框中收到通知。

由于 jQuery 在文件名中包含版本号,因此将 jQuery 更新到最新版本还需要更新 <script> 引用 jQuery 文件的标记以使用新文件名。 其他包含的脚本库不包括脚本名称中的版本号,因此可以更轻松地将其更新到最新版本。

ASP.NET MVC 3 中的已知问题

  • 在某些情况下,安装可能会失败,并显示错误消息“安装失败并出现错误代码(0x80070643)”。 有关如何解决此问题的信息,请参阅 KnowledgeBase 文章2531566
  • 添加控制器的基架不会搭建利用 Entity Framework 中的实体继承支持的基架。 例如,给定学生类继承的基 Person 类,基架学生类将导致生成的代码未编译。
  • 在解决方案文件夹中创建新的 ASP.NET MVC 3 项目会导致 NullReferenceException 错误。 解决方法是在解决方案根目录中创建 ASP.NET MVC 3 项目,然后将其移动到解决方案文件夹中。
  • 安装 ReSharper 时,适用于 Razor 语法的 IntelliSense 不起作用。 如果已安装 ReSharper 并希望利用 ASP.NET MVC 3 中的 Razor IntelliSense 支持,请参阅 Hadi Hariri 博客上的 Razor Intellisense 和 ReSharper 条目,其中讨论了今天一起使用的方法。
  • 在安装过程中,EULA 接受对话框在小于预期窗口中显示许可条款。
  • 编辑 Razor 视图时(.cshtml 或 .vbhtml 文件),视图。 ASP.NET MVC 3 不包含 Razor 视图的任何代码片段。aspxselecting a code snippet for ASP.NET MVC will show snippets for
  • 如果在未安装 Visual Studio 的计算机上安装 ASP.NET MVC 3 for Visual Web Developer Express,然后安装 Visual Studio,则必须重新安装 ASP.NET MVC 3。 由 ASP.NET MVC 3 安装程序升级的 Visual Studio 和 Visual Web Developer Express 共享组件。 如果在没有 Visual Web Developer Express 的计算机上安装 ASP.NET MVC 3 for Visual Studio,然后安装 Visual Web Developer Express,则同样适用。

ASP.NET MVC 3 RTM 中的更改

本部分介绍自 RC2 发布以来在 ASP.NET MVC 3 RTM 版本中所做的更改和 bug 修复。

更改:将 jQuery UI 的版本更新为 1.8.7

Visual Studio 的 ASP.NET MVC 项目模板已更新为包含最新版本的 jQuery UI 库。 这些模板还包括 jQuery UI 所需的最小资源文件集,例如关联的 CSS 和图像文件。

更改:将默认 ModelMetadataProvider 更改回 DataAnnotationsModelMetadataProvider

ASP.NET MVC 3 的 RC2 版本引入了 CachedDataAnnotationsMetadataProvider 类,该类在现有 DataAnnotationsModelMetadataProvider 类的基础上提供缓存作为性能改进。 但是,此实现报告了一些 bug,因此更改已还原并移动到 MVC Futures 项目,该项目在 ASP.NET WebStack提供。

已修复:粘贴包含空格的 Razor 表达式的一部分会导致其反转

在 ASP.NET MVC 3 的预发行版本中,将包含空格的 Razor 表达式的一部分粘贴到 Razor 文件中时,生成的表达式将反转。 例如,请考虑以下 Razor 代码块:

@SomeMethod("first param",
100)
@AnotherMethod()

如果在第一个方法中选择文本“first param”并将其作为参数粘贴到第二个方法中,则结果如下所示:

@AnotherMethod(param""first)

正确的行为是粘贴操作应导致以下结果:

@AnotherMethod("first param")

在 RTM 版本中已修复此问题,以便在粘贴操作期间正确保留表达式。

已修复:重命名在编辑器中打开的 Razor 文件会禁用语法着色和 IntelliSense

在编辑器窗口中打开文件时使用 解决方案资源管理器 重命名 Razor 文件会导致语法突出显示,IntelliSense 停止处理该文件。 已修复此问题,以便在重命名后保留突出显示和 IntelliSense。

ASP.NET MVC 3 RTM 的已知问题

  • 如果在 NuGet 程序包管理器控制台打开时关闭 Visual Studio 2010 SP1 Beta 版,Visual Studio 会崩溃并尝试重启。 这将在 Visual Studio 2010 SP1 的 RTM 版本中修复。
  • ASP.NET MVC 3 安装程序只能安装 NuGet 包管理器的初始版本。 安装初始版本后,可以使用 Visual Studio 扩展管理器安装和更新 NuGet。 如果已安装 NuGet,请转到 Visual Studio 扩展库以更新到最新版本的 NuGet。
  • 在解决方案文件夹中创建新的 ASP.NET MVC 3 项目会导致 NullReferenceException 错误。 解决方法是在解决方案根目录中创建 ASP.NET MVC 3 项目,然后将其移动到解决方案文件夹中。
  • 安装程序可能需要比以前版本的 ASP.NET MVC 完成的时间要长得多。 这是因为它更新 Visual Studio 2010 的组件。
  • 安装 ReSharper 时,适用于 Razor 语法的 IntelliSense 不起作用。 如果已安装 ReSharper 并希望利用 ASP.NET MVC 3 中的 Razor IntelliSense 支持,请参阅 Hadi Hariri 博客上的 Razor Intellisense 和 ReSharper 条目,其中讨论了今天一起使用的方法。
  • 使用 beta 版本的 ASP.NET MVC 3 创建的 CCSHTML 和 VBHTML 视图没有正确设置其生成操作,因此在发布项目时省略这些视图类型。 这些文件的生成操作值应设置为“Content”。 ASP.NET MVC 3 RTM 为新文件修复了此问题,但未更正使用预发行版本创建的项目的现有文件设置。
  • “属性”对话框的屏幕截图,其中打开了“生成操作”菜单。已选择内容选项。
  • 在安装过程中,EULA 接受对话框在小于预期窗口中显示许可条款。
  • 编辑 Razor 视图 (.cshtml 文件)时,Visual Studio 中的“转到控制器”菜单项将不可用,并且没有代码片段。
  • 如果在未安装 Visual Studio 的计算机上安装 ASP.NET MVC 3 for Visual Web Developer Express,然后安装 Visual Studio,则必须重新安装 ASP.NET MVC 3。 由 ASP.NET MVC 3 安装程序升级的 Visual Studio 和 Visual Web Developer Express 共享组件。 如果在没有 Visual Web Developer Express 的计算机上安装 ASP.NET MVC 3 for Visual Studio,然后安装 Visual Web Developer Express,则同样适用。

ASP.NET MVC 3 中的中断性变更

  • 在早期版本的 ASP.NET MVC 中,操作筛选器按请求创建,但少数情况下除外。 此行为从来不是保证的行为,但只是实现详细信息,筛选器的协定是将它们视为无状态行为。 在 ASP.NET MVC 3 中,筛选器缓存得更激进。 因此,任何不当存储实例状态的自定义操作筛选器都可能会中断。
  • 对于具有相同 Order 值的异常筛选器,异常筛选器的执行顺序已更改。 在 ASP.NET MVC 2 及更早版本中,在操作方法上的异常筛选器 之前,会在操作方法上的异常筛选器之前对控制器执行具有相同 Order 值的异常筛选器。 这通常是在没有指定 Order 值的情况下应用异常筛选器的情况。 在 ASP.NET MVC 3 中,此顺序已撤消,以便最具体的异常处理程序先执行。 与早期版本中一样,如果 显式指定 Order 属性,则按指定顺序运行筛选器。
  • 名为 FileExtensions 的新属性已添加到 VirtualPathProviderViewEngine 基类。 当 ASP.NET 按路径(而不是按名称)查找视图时,只考虑此新属性指定的列表中包含文件扩展名的视图。 这是在注册自定义生成提供程序以便为 Web 窗体视图启用自定义文件扩展名的应用程序中的中断性变更,提供程序使用完整路径而不是名称引用这些视图。 解决方法是修改 FileExtensions 属性的值以包含自定义文件扩展名。
  • 直接实现 IControllerFactory 接口的自定义控制器工厂实现必须提供在此版本中添加到接口的新 GetControllerSessionBehavior 方法的实现。 通常,建议不要直接实现此接口,而是从 DefaultControllerFactory 派生类。

ASP.NET MVC 3 RC2 中的更改

本部分介绍自 RC 版本以来在 ASP.NET MVC 3 RC2 版本中所做的更改(新功能和 bug 修复)。

项目模板更改为包含 jQuery 1.4.4、jQuery 验证 1.7 和 jQuery UI 1.8.6

ASP.NET MVC 3 的项目模板现在包括最新版本的 jQuery、jQuery 验证和 jQuery UI。jQuery UI 是项目模板的新增功能,提供有用的用户界面小组件。 有关 jQuery UI 的详细信息,请访问其主页: http://jqueryui.com/

添加了“AdditionalMetadataAttribute”类

可以使用 AdditionalMetadataAttribute 类填充模型属性的 ModelMetadata.AdditionalValues 字典。

例如,假设视图模型具有应仅向管理员显示的属性。 可以使用 AdminOnly 作为键和 true 作为值来批注该模型,如以下示例所示:

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

呈现产品视图模型时,此元数据可用于任何显示或编辑器模板。 由你作为应用程序开发人员来解释元数据信息。

改进了视图基架

用于基架视图的 T4 模板现在生成对模板帮助程序方法(如 EditorFor的调用,而不是 TextBoxFor帮助程序。 此更改改进了在“添加视图”对话框生成视图时以数据注释属性的形式对模型元数据的支持。

“添加视图”基架还包括基于约定改进的模型主键信息的检测和用法。 例如,“添加视图”对话框使用此信息来确保主键值未基架为可编辑的窗体字段。

默认的“编辑”和“创建”模板包括对客户端验证所需的 jQuery 脚本的引用。

添加了 Html.Raw 方法

默认情况下,Razor 视图引擎 HTML 对所有值进行编码。 例如,以下代码片段对问候语变量内的 HTML 进行编码,使其在页面中 <strong>Hello World!</strong>显示为 。

@{
  string greeting = "<strong>Hello World!</strong>";
}

<p>@greeting</p>

新的 Html.Raw 方法提供了一种在已知内容安全时显示未编码 HTML 的简单方法。 以下示例显示相同的字符串,但字符串呈现为标记:

@{
  string greeting = "<strong>Hello World!</strong>";
}

<p>@Html.Raw(greeting)</p>

已将“Controller.ViewModel”属性和“View”属性重命名为“ViewBag”

以前,控制器ViewModel 属性对应于视图的 View 属性。 这两个属性都提供了一种使用动态属性访问器语法访问 ViewDataDictionary 对象的值的方法。 这两个属性都已重命名为相同的属性,以避免混淆并更加一致。

已将“ControllerSessionStateAttribute”类重命名为“SessionStateAttribute”

ControllerSessionStateAttribute 类是在 ASP.NET MVC 3 的 RC 版本中引入的。 该属性已重命名为更简洁。

已将 RemoteAttribute“Fields”属性重命名为“AdditionalFields”

RemoteAttribute 类的 Fields 属性在用户之间造成了一些混淆。 将此属性重命名为 AdditionalFields 阐明了其意图。

已将“SkipRequestValidationAttribute”重命名为“AllowHtmlAttribute”

SkipRequestValidationAttribute 属性已重命名为 AllowHtmlAttribute,以更好地表示其预期用法。

更改了“Html.ValidationMessage”方法以显示第一条有用的错误消息

已修复 Html.ValidationMessage 方法,以显示第一条有用的错误消息,而不只是显示第一个错误。

在模型绑定期间, 可以从多个源填充 ModelState 字典,其中包含有关属性的错误消息,包括来自模型本身(如果它实现 IValidatableObject)、应用于属性的验证属性以及访问属性时引发的异常。

当 Html.ValidationMessage 方法显示验证消息时,它将跳过包含异常的模型状态条目,因为这些条目通常不适用于最终用户。 相反,该方法查找与异常不关联的第一条验证消息,并显示该消息。 如果未找到此类消息,则默认为与第一个异常关联的通用错误消息。

修复 @model 了不向文档添加空格的声明

在早期版本中, @model 视图顶部的声明向呈现的 HTML 输出添加了空白行。 已修复此问题,以便声明不会引入空格。

添加了“FileExtensions”属性以查看引擎以支持特定于引擎的文件名

视图引擎可以使用显式视图路径返回视图,如以下示例所示:

return View("~/views/home/index.cshtml");

第一个视图引擎始终尝试呈现视图。 默认情况下,Web 窗体视图引擎是第一个视图引擎;由于 Web 窗体引擎无法呈现 Razor 视图,因此会发生错误。 视图引擎现在具有 FileExtensions 属性,用于指定它们支持的文件扩展名。 当 ASP.NET 确定视图引擎是否可以呈现文件时,将检查此属性。 这是一项重大更改,本文档的 “重大更改 ”部分包含更多详细信息。

修复了“LabelFor”帮助程序以发出“For”属性的正确值

修复了一个 bug,其中 LabelFor 方法呈现了与输入元素的名称属性(而不是其 ID)匹配的属性。 根据 W3C,for 属性应与输入元素的 ID 匹配

修复了“RenderAction”方法,用于在模型绑定期间授予显式值优先级

在早期版本中,传递给 RenderAction 方法的显式值在子操作中的模型绑定期间被忽略,以支持当前表单值。 修复可确保显式值在模型绑定期间优先。

ASP.NET MVC 3 RC2 中的中断性变更

  • 在早期版本的 ASP.NET MVC 中,每个请求创建操作筛选器,但少数情况下除外。 此行为从来不是保证的行为,但只是实现详细信息,筛选器的协定是将它们视为无状态行为。 在 ASP.NET MVC 3 中,筛选器缓存得更激进。 因此,任何不当存储实例状态的自定义操作筛选器都可能会中断。
  • 对于具有相同 Order 值的异常筛选器,异常筛选器的执行顺序已更改。 在 ASP.NET MVC 2 及更早版本中,在操作方法上的异常筛选器之前,在操作方法上的异常筛选器之前,控制器上的异常筛选器与操作方法上的异常筛选器相同。 这通常是在没有指定 Order 值的情况下应用异常筛选器的情况。 在 ASP.NET MVC 3 中,此顺序已撤消,以便最具体的异常处理程序先执行。 与早期版本中一样,如果 显式指定 Order 属性,则按指定顺序运行筛选器。
  • 名为 FileExtensions 的新属性已添加到 VirtualPathProviderViewEngine 基类。 当 ASP.NET 按路径(而不是按名称)查找视图时,只考虑此新属性指定的列表中包含文件扩展名的视图。 这是在注册自定义生成提供程序以便为 Web 窗体视图启用自定义文件扩展名的应用程序中的中断性变更,提供程序使用完整路径而不是名称引用这些视图。 解决方法是修改 FileExtensions 属性的值以包含自定义文件扩展名。
  • 直接实现 IControllerFactory 接口的自定义控制器工厂实现必须提供在此版本中添加到接口的新 GetControllerSessionBehavior 方法的实现。 通常,建议不要直接实现此接口,而是从 DefaultControllerFactory 派生类。

ASP.NET MVC 3 RC2 中的已知问题

  • ASP.NET MVC 3 安装程序只能安装 NuGet 包管理器的初始版本。 安装初始版本后,可以使用 Visual Studio 扩展管理器安装和更新 NuGet。 如果已安装 NuGet,请转到 Visual Studio 扩展库以更新到最新版本的 NuGet。
  • 在解决方案文件夹中创建新的 ASP.NET MVC 3 项目会导致 NullReferenceException 错误。 解决方法是在解决方案根目录中创建 ASP.NET MVC 3 项目,然后将其移动到解决方案文件夹中。
  • 安装程序可能需要比以前版本的 ASP.NET MVC 完成的时间要长得多。 这是因为它更新 Visual Studio 2010 的组件。
  • 安装 ReSharper 时,适用于 Razor 语法的 IntelliSense 不起作用。 如果已安装 ReSharper 并想要利用 ASP.NET MVC 3 RC2 中的 Razor IntelliSense 支持,请参阅 Hadi Hariri 博客上的 Razor Intellisense 和 ReSharper 条目,其中讨论了今天一起使用的方法。
  • 使用 beta 版 ASP.NET MVC 3 创建的 CSHTML 和 VBHTML 视图没有正确设置其生成操作,因此在发布项目时省略这些视图类型。 这些文件的 “生成操作 ”值应设置为“内容”。 ASP.NET MVC 3 RC2 修复了此问题,但未更正使用 Beta 版本创建的项目的现有文件设置。“属性”对话框的屏幕截图。生成操作菜单处于打开状态,并且已选择内容选项。
  • 在安装过程中,EULA 接受对话框在小于预期窗口中显示许可条款。
  • 编辑 Razor 视图 (.cshtml 文件)时,Visual Studio 中的“转到控制器”菜单项将不可用,并且没有代码片段。
  • 如果在未安装 Visual Studio 的计算机上安装 ASP.NET MVC 3 for Visual Web Developer Express,然后安装 Visual Studio,则必须重新安装 ASP.NET MVC 3。 由 ASP.NET MVC 3 安装程序升级的 Visual Studio 和 Visual Web Developer Express 共享组件。 如果在没有 Visual Web Developer Express 的计算机上安装 ASP.NET MVC 3 for Visual Studio,然后安装 Visual Web Developer Express,则同样适用。
  • 如果已安装 NuGet,则安装 ASP.NET MVC 3 RC 2 不会更新 NuGet。 若要升级 NuGet,请转到 Visual Studio 扩展管理器,它应显示为可用更新。 可以从该处将 NuGet 升级到最新版本。

ASP.NET MVC 3 候选版本

ASP.NET MVC 发布候选项于 2010 年 11 月 9 日发布。

ASP.NET MVC 3 RC 中的新功能

本部分介绍自 Beta 版本以来在 ASP.NET MVC 3 RC 版本中引入的功能。

NuGet 程序包管理器

ASP.NET MVC 3 包括 NuGet 程序包管理器(以前称为 NuPack),这是一种集成包管理工具,用于将库和工具添加到 Visual Studio 项目。 此工具可自动执行开发人员今天执行的步骤,以便将库放入其源树中。

可以使用 NuGet 作为命令行工具、Visual Studio 2010 中的集成控制台窗口、Visual Studio 上下文菜单和一组 PowerShell cmdlet。

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

改进了“新建项目”对话框

创建新项目时,“新建项目”对话框现在允许你指定视图引擎以及 ASP.NET MVC 项目类型。

“新建项目”对话框的屏幕截图。视图引擎菜单处于打开状态,并选择了 razor。

此版本中包括对修改对话框中列出的模板和视图引擎列表的支持。

默认模板如下:

空白。 包含 ASP.NET MVC 项目的最低文件集,包括 ASP.NET MVC 项目的默认目录结构、包含默认 ASP.NET MVC 样式的Site.css文件,以及包含默认 JavaScript 文件的脚本目录。

Internet 应用程序。 包含演示如何将成员资格提供程序用于 ASP.NET MVC 的示例功能。

对话框中显示的项目模板列表在 Windows 注册表中指定。

无会话控制器

新的 ControllerSessionStateAttribute 通过指定 System.Web.SessionState.SessionStateBehavior 枚举值,可以更好地控制控制器的会话状态行为。

以下示例演示如何关闭对控制器的所有请求的会话状态。

[ControllerSessionState(SessionStateBehavior.Disabled)]
public class CoolController : Controller {
    public ActionResult Index() {
        object o = Session["Key"]; // Causes an exception.

    }
}

以下示例演示如何为所有请求设置控制器的只读会话状态。

[ControllerSessionState(SessionStateBehavior.ReadOnly)]
public class CoolController : Controller {
    public ActionResult Index() {
    Session["Key"] = "value"; // Value is not available in
    the next request
    }
}

新的验证属性

CompareAttribute

使用新的 CompareAttribute 验证属性可以比较模型两个不同属性的值。 在以下示例中,ComparePassword 属性必须与“密码”字段匹配才能有效。

public class User {
    [Required]

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

RemoteAttribute

新的 RemoteAttribute 验证属性利用 jQuery 验证插件的远程验证程序,使客户端验证能够在服务器上调用执行实际验证逻辑的方法。

在以下示例中 ,UserName 属性 应用了 RemoteAttribute 。 在编辑视图中编辑此属性时,客户端验证将在 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";
    }
}

默认情况下,将属性应用到的属性名称作为查询字符串参数发送到操作方法。

“LabelFor”和“LabelForModel”方法的新重载

已为 LabelForLabelForModel 方法添加了新的重载,可用于指定标签文本。 以下示例演示如何使用这些重载。

@Html.LabelFor(m => m.PropertyName,
"Label Text");
@Html.LabelForModel("Label Text");

子操作输出缓存

OutputCacheAttribute 支持使用 Html.RenderActionHtml.Action 帮助程序方法调用的子操作的输出缓存。 以下示例演示调用另一个操作的视图。

Hi there. The uncached time is:
@DateTime.Now
The cached time is: @Html.Action("GetDate")

GetDate 操作使用 OutputCacheAttribute 进行批注:

[OutputCache(Duration = 100,
VaryByParam = "none")]
public string GetDate() {
    return DateTime.Now.ToString();
}

运行此代码时,对 Html.Action(“GetDate”)的调用结果将缓存 100 秒。

“添加视图”对话框改进

添加强类型视图时,“添加视图”对话框现在筛选出比以前版本中更适用的类型,例如许多核心 .NET Framework 类型。 此外,列表现在按类名排序,而不是完全限定的类型名称,这使得查找类型更容易。 例如,类型名称现在如以下示例所示:

ClassName (命名空间)

在早期版本中,这会显示为以下内容:

Namespace.ClassName

精细请求验证

ValidateInputAttributeExclude 属性不再存在。 相反,若要在模型绑定期间为模型的特定属性跳过请求验证,请使用新的 SkipRequestValidationAttribute

例如,假设操作方法用于编辑博客文章:

[HttpPost]
public ActionResult Edit(BlogPostViewModel post) {
    // Save the post in the database
}

以下示例演示博客文章的视图模型。

public class BlogPostViewModel {
    public int Id {get; set;}

    public string Subject {get; set;}

    public string Description {get; set;}
}

当用户提交 Description 属性的一些标记时,模型绑定将因请求验证而失败。 若要在博客文章 Description 的模型绑定期间禁用请求验证,请将 SkipRequpestValidationAttribute 应用到属性,如以下示例所示:

public class BlogPostViewModel {
    public int Id {get; set;}

    public string Subject {get; set;}

    [SkipRequestValidation]

    public string Description {get; set;}
}

或者,若要关闭模型的每个属性的请求验证,请将值为 falseValidateInputAttribute 应用于操作方法:

[HttpPost]
[ValidateInput(false)]
public ActionResult Edit(BlogPostViewModel post) {
    // Save the post in the database
}

ASP.NET MVC 3 RC 中的中断性变更

  • 对于具有相同 Order 值的异常筛选器,异常筛选器的执行顺序已更改。 在 ASP.NET MVC 2 及更早版本中,在操作方法上的异常筛选器之前,在操作方法上的异常筛选器之前,控制器上的异常筛选器与操作方法上的异常筛选器相同。 这通常是在没有指定 Order 值的情况下应用异常筛选器的情况。 在 ASP.NET MVC 3 中,此顺序已撤消,以便最具体的异常处理程序先执行。 与早期版本中一样,如果 显式指定 Order 属性,则按指定顺序运行筛选器。
  • 向 VirtualPathProviderViewEngine 基类添加了名为 FileExtensions 的新属性。 按路径(而不是按名称)查找视图时,仅考虑具有此新属性所指定的列表中的文件扩展名的视图。 对于注册自定义生成提供程序以启用 Web 窗体视图的自定义文件扩展名,并使用完整路径而不是名称引用这些视图的用户,这是一项重大更改。 解决方法是修改 FileExtensions 属性的值以包含自定义文件扩展名。

ASP.NET MVC 3 RC 中的已知问题

  • 安装程序可能需要比以前版本的 ASP.NET MVC 完成的时间要长得多,因为它更新了 Visual Studio 2010 的组件。
  • 选择一个强类型视图基架时添加视图基架将只写属性。 基架应始终忽略这些内容。 生成“编辑”或“创建”视图时,“添加视图”对话框还会搭建只读属性。 只读属性应仅为“显示”和“列表”视图搭建基架。
  • ASP.NET MVC 3 与 Async CTP 一起安装时,调试不起作用。 ASP.NET MVC 3 不能与 Async CTP 并行安装。 卸载异步 CTP 以修复调试。 有关更多详细信息,请阅读 此博客文章 ,了解如何卸载所有 ASP.NET MVC 3 RC 部分。
  • 安装 Resharper 时,Razor Intellisense 不起作用。 如果已安装 ReSharper 并希望利用 ASP.NET MVC 3 RC 中的 Razor intellisense 支持,请阅读 JetBrains 的这篇博客文章 ,其中讨论了今天一起使用的方法。
  • 使用 ASP.NET MVC 3 Beta 创建的 CSHTML 和 VBHTML 视图没有正确生成操作,无法将其从发布中省略。 这些文件的 生成操作 应设置为“内容”。 ASP.NET MVC 3 RC 修复了此问题,但未更正使用 Beta 版创建的项目的现有文件设置。
  • 安装程序可能需要比以前版本的 ASP.NET MVC 完成的时间要长得多,因为它更新了 Visual Studio 2010 的组件。
  • 选择“编辑”强类型视图基架时添加视图基架将只读属性。 同样,只写属性为“显示”视图搭建基架。
  • 在安装过程中,EULA 接受对话框在小于预期窗口中显示许可条款。
  • 安装 Visual Studio Async CTP 会导致与作为 ASP.NET MVC 3 工具安装一部分的 Razor 版本发生冲突。 请确保不要尝试在同一台计算机上安装 Visual Studio Async CTP 和 Razor 版本。
  • 编辑 Razor 视图 (.cshtml 文件)时,Visual Studio 中的“转到控制器”菜单项将不可用,并且没有代码片段。

ASP.NET MVC 3 Beta

ASP.NET MVC 3 Beta 版于 2010 年 10 月 6 日发布。 以下说明特定于 Beta 版本,并受上述 ASP.NET MVC 3 候选版部分中引用的任何更新或更改的约束。

MVC 3 Beta 版 ASP.NET 新功能

本部分介绍在 ASP.NET MVC 3 Beta 版本中引入的功能。

NuGet 程序包管理器

ASP.NET MVC 3 包括 NuGet 程序包管理器,它是一种集成包管理工具,用于将库和工具添加到 Visual Studio 项目。 在大多数情况下,它会自动执行开发人员今天执行的步骤,以便将库放入其源树中。

可以使用 NuGet 作为命令行工具、Visual Studio 2010 中的集成控制台窗口、Visual Studio 上下文菜单和 PowerShell cmdlet 集。

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

改进了“新建项目”对话框

创建新项目时,“新建项目”对话框现在允许你指定视图引擎以及 ASP.NET MVC 项目类型。

“新建项目”对话框的屏幕截图。从视图引擎菜单中选择 Razor。

此版本中不包括修改对话框中列出的模板和视图引擎列表的支持。

默认模板如下:

空白。 包含 ASP.NET MVC 项目的最小文件集,包括 ASP.NET MVC 项目的默认目录结构、包含默认 ASP.NET MVC 样式的小型Site.css文件,以及包含默认 JavaScript 文件的脚本目录。

Internet 应用程序。 包含演示如何在 ASP.NET MVC 中使用成员资格提供程序的示例功能。

在 Razor 视图中指定强类型模型的简化方法

通过使用 CSHTML 视图的新 @model 指令和 @ModelType VBHTML 视图的指令,简化了强类型 Razor 视图的模型类型的方法。 在早期版本的 ASP.NET MVC 中,可以采用这种方式为 Razor 视图指定强类型模型:

@inherits System.Web.Mvc.WebViewPage

在此版本中,可以使用以下语法:

@model MyModelNamespace.MyModelType

支持新的 ASP.NET 网页帮助程序方法

新的 ASP.NET 网页技术包括一组帮助程序方法,这些方法可用于向视图和控制器添加常用功能。 ASP.NET MVC 3 支持在控制器和视图(如果适用)中使用这些帮助程序方法。 这些方法包含在 System.Web.Helpers 程序集中。 下表列出了一些 ASP.NET 网页帮助程序方法。

助手 描述
图表 在视图中呈现图表。 包含 Chart.ToWebImage、Chart.Save 和 Chart.Write 等方法。
Crypto 使用哈希算法创建正确加盐和哈希的密码。
WebGrid 将对象集合(通常是数据库中的数据)呈现为网格。 支持分页和排序。
WebImage 呈现图像。
WebMail 发送电子邮件。

以下 URL 中的 ASP.NET Razor 语法文档中提供了一个快速参考主题,其中列出了帮助器和基本语法:

https://www.asp.net/webmatrix/tutorials/asp-net-web-pages-api-reference

其他依赖项注入支持

基于 ASP.NET MVC 3 预览版 1 版本,当前版本包括添加了对两个新服务和四个现有服务的支持,并改进了对依赖项解析和 Common Service 定位符的支持。

用于细化控制器实例化的新 IControllerActivator 接口

新的 IControllerActivator 接口更精细地控制通过依赖项注入实例化控制器的方式。 以下示例展示了 接口:

namespace System.Web.Mvc {
    using System.Web.Routing;

    public interface IControllerActivator {
        IController Create(RequestContext requestContext, Type controllerType);
    }
}

这与控制器工厂的角色形成鲜明对比。 控制器工厂是 IControllerFactory 接口的实现,该接口负责查找控制器类型和实例化该控制器类型的实例。

控制器激活器仅负责实例化控制器类型的实例。 它们不执行控制器类型查找。 找到适当的控制器类型后,控制器工厂应委托给 IControllerActivator 实例来处理控制器的实际实例。

DefaultControllerFactory 类具有接受 IControllerFactory 实例的新构造函数。 这样,便可以应用依赖关系注入来管理控制器创建的这一方面,而无需重写默认控制器类型查找行为。

IServiceLocator 接口替换为 IDependencyResolver

根据社区反馈,ASP.NET MVC 3 Beta 版本已将 IServiceLocator 接口的使用替换为特定于 ASP.NET MVC 需求的精简 IDependencyResolver 接口。 以下示例显示了新接口:

namespace System.Web.Mvc {
    using System.Collections.Generic;

    public interface IDependencyResolver {
        object GetService(Type serviceType);
        IEnumerable<object> GetServices(Type serviceType);
    }
}

作为此更改的一部分,ServiceLocator 类也替换为 DependencyResolver 类。 依赖项解析程序的注册类似于早期版本的 ASP.NET MVC:

DependencyResolver.SetResolver(myResolver);

此接口的实现应只委托给基础依赖项注入容器,以提供所请求类型的已注册服务。

如果没有请求类型的已注册服务,ASP.NET MVC 要求此接口的实现从 GetService 返回 null,并从 GetServices 返回空集合。

通过新的 DependencyResolver 类,可以注册实现新 IDependencyResolver 接口或 Common Service Locator 接口(IServiceLocator)的类。 有关 Common Service Locator 的详细信息,请参阅 GitHub 上的 CommonServiceLocator。

用于细化视图页面实例化的新 IViewActivator 接口

新的 IViewPageActivator 接口更精细地控制如何通过依赖项注入实例化视图页。 这适用于 WebFormView 实例和 RazorView 实例。 以下示例显示了新接口:

namespace System.Web.Mvc {
    public interface IViewPageActivator {
        object Create(ControllerContext controllerContext, Type type);
    }
}

这些类现在接受 IViewPageActivator 构造函数参数,该参数允许你使用依赖项注入来控制 ViewPage、ViewUserControl 和 WebViewPage 类型的实例化方式。

现有服务的新依赖项解析程序支持

新版本包括对以下服务的依赖项解析支持:

  • 模型验证提供程序。 可以在依赖项解析程序中注册实现 ModelValidatorProvider 的类,系统将使用这些类来支持客户端和服务器端验证。
  • 模型元数据提供程序。 可以在依赖项解析器中注册实现 ModelMetadataProvider 的单个类,系统将使用它来提供模板化和验证系统的元数据。
  • 值提供程序。 实现 ValueProviderFactory 的类可以在依赖项解析器中注册,系统将使用这些类来创建控制器和模型绑定期间使用的值提供程序。
  • 模型绑定器。 可以在依赖项解析器中注册实现 IModelBinderProvider 的类,系统将使用它们来创建模型绑定器,这些绑定器由模型绑定系统使用。

对基于 Unobtrusive jQuery 的 Ajax 的新支持

ASP.NET MVC 包括 Ajax 帮助程序方法,如下所示:

  • Ajax.ActionLink
  • Ajax.RouteLink
  • Ajax.BeginForm
  • Ajax.BeginRouteForm

这些方法使用 JavaScript 在服务器上调用操作方法,而不是使用完整回发。 此功能已更新,以不显眼的方式利用 jQuery。 这些帮助程序方法不是侵入性地发出内联客户端脚本,而是使用 data-ajax 前缀发出 HTML5 属性,将行为与标记分开。 然后,通过引用相应的 JavaScript 文件将行为应用于标记。 请确保引用以下 JavaScript 文件:

  • jquery-1.4.1.js
  • jquery.unobtrusive.ajax.js

此功能默认在 ASP.NET MVC 3 新项目模板的 Web.config 文件中启用,但默认为现有项目禁用。 有关详细信息,请参阅 本文档后面的客户端验证和不显眼的 JavaScript 的已添加应用程序范围的标志。

对 Unobtrusive jQuery 验证的新支持

默认情况下,ASP.NET MVC 3 Beta 以不显眼的方式使用 jQuery 验证来执行客户端验证。 若要启用不显眼的客户端验证,请从视图中进行如下调用:

Html.EnableClientValidation();

这要求 ViewContext.UnobtrusiveJavaScriptEnabled 属性设置为 true,可以通过进行以下调用来执行此操作:

Html.EnableUnobtrusiveJavaScript();

此外,请确保引用以下 JavaScript 文件。

  • jquery-1.4.1.js
  • jquery.validate.js
  • jquery.validate.unobtrusive.js

此功能默认在 ASP.NET MVC 3 新项目模板的 Web.config 文件中启用,但默认为现有项目禁用此功能。 有关详细信息,请参阅 本文档后面的新应用程序范围的标志,用于客户端验证和不显眼的 JavaScript

用于客户端验证和非干扰 JavaScript 的新应用程序范围标志

可以使用 HtmlHelper 类的静态成员全局启用或禁用客户端验证和非公开 JavaScript,如以下示例所示:

HtmlHelper.ClientValidationEnabled = true;
HtmlHelper.UnobtrusiveJavaScriptEnabled = true;

默认项目模板默认启用不显眼的 JavaScript。 还可以使用以下设置在应用程序的根 Web.config 文件中启用或禁用这些功能:

<configuration>
        <appSettings>
            <add key="ClientValidationEnabled" value="true"/>
            <add key="UnobtrusiveJavaScriptEnabled" value="true"/>
        </appSettings>
    </configuration>

由于默认情况下可以启用这些功能,因此会向 HtmlHelper 类引入新的重载,以便重写默认设置,如以下示例所示:

public void EnableClientValidation();
public void EnableClientValidation(bool enabled);
public void EnableUnobtrusiveJavaScript();
public void EnableUnobtrusiveJavaScript(bool enabled);

为了向后兼容,这两项功能默认处于禁用状态。

对在视图运行之前运行的代码的新支持

现在可以将名为 _viewstart.cshtml(或 _viewstart.vbhtml)的文件放在 Views 目录中,并将代码添加到将在该目录及其子目录中的多个视图之间共享的代码。 例如,可以将以下代码放入 ~/Views 文件夹中的 _viewstart.cshtml 页:

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

这会以递归方式设置 Views 文件夹及其所有子文件夹中每个视图的布局页面。 呈现视图时,_viewstart.cshtml 文件中的代码在视图代码运行之前运行。 _viewstart.cshtml 代码适用于该文件夹中的每个视图。

默认情况下,_viewstart.cshtml 文件中的代码也适用于任何子文件夹中的视图。 但是,单个子文件夹可以有自己的 _viewstart.cshtml 文件版本;在这种情况下,本地版本优先。 例如,若要运行 HomeController 的所有视图通用的代码,请将 _viewstart.cshtml 文件放在 ~/Views/Home 文件夹中。

对 VBHTML Razor 语法的新支持

前面的 ASP.NET MVC 预览版包含对使用基于 C# 的 Razor 语法的视图的支持。 这些视图使用 .cshtml 文件扩展名。 作为支持 Razor 的持续工作的一部分,ASP.NET MVC 3 Beta 引入了对 Visual Basic 中 Razor 语法的支持,该语法使用 .vbhtml 文件扩展名。

有关在 VBHTML 页面中使用 Visual Basic 语法的简介,请参阅以下 URL 中的教程:

https://www.asp.net/webmatrix/tutorials/asp-net-web-pages-visual-basic

对 ValidateInputAttribute 进行更精细的控制

ASP.NET MVC 始终包含 ValidateInputAttribute 类,该类调用核心 ASP.NET 请求验证基础结构,以确保传入请求不包含潜在的恶意输入。 默认情况下,将启用输入验证。 可以使用 ValidateInputAttribute 属性禁用请求验证,如以下示例所示:

[ValidateInput(false)]
public ActionResult SomeAction() {
    return View();
}

但是,许多 Web 应用程序具有需要允许 HTML 的单个窗体字段,而其余字段则不应。 ValidateInputAttribute 类现在允许指定不应包含在请求验证中的字段列表。

例如,如果要开发博客引擎,可能需要在“正文”和“摘要”字段中允许标记。 这些字段可能由两个输入元素表示,每个输入元素具有与属性名称(“Body”和“Summary”)对应的名称属性。 若要仅禁用这些字段的请求验证,请在 ValidateInput 类的 Exclude 属性中指定名称(逗号分隔),如以下示例所示:

[ValidateInput(true, Exclude="Body, Summary")]
public ActionResult About() {
    return View();
}

帮助程序将下划线转换为使用匿名对象指定的 HTML 属性名称的连字符

借助 Helper 方法,可以使用匿名对象指定属性名称/值对,如以下示例所示:

Html.TextBox("Name", "Value", new {title = "Title"})

此方法不允许在属性名称中使用连字符,因为连字符不能用于 ASP.NET 中的属性名称。 但是,连字符对于自定义 HTML5 属性非常重要;例如,HTML5 使用“data-”前缀。

同时,下划线不能用于 HTML 中的属性名称,但在属性名称中有效。 因此,如果使用匿名对象指定属性,并且属性名称包括下划线,则帮助程序方法会将下划线转换为连字符。 例如,以下帮助程序语法使用下划线:

Html.TextBox("Name", "Value", new {data_required = "true"})

上一个示例在帮助程序运行时呈现以下标记:

<input data-required="true" id="Name" name="Name"
       type="textbox" value="Value" />

缺陷修复

EditorFor 和 DisplayFor 模板帮助程序的默认对象模板现在支持 DisplayAttribute.Order 属性中指定的排序。 (在以前的版本中,未使用“订单”设置。

客户端验证现在支持验证已应用验证属性的重写属性。

JsonValueProviderFactory 现在默认注册。

重大更改

对于具有相同 Order 值的异常筛选器,异常筛选器的执行顺序已更改。 在 ASP.NET MVC 2 及更早版本中,在操作方法上的异常筛选器之前,在操作方法上的异常筛选器之前,对控制器执行与操作方法上的异常筛选器相同的顺序。 这通常是在没有指定 Order 值的情况下应用异常筛选器的情况。 在 ASP.NET MVC 3 中,此顺序已撤消,以便最具体的异常处理程序先执行。 与早期版本中一样,如果显式指定 Order 属性,则按指定顺序运行筛选器。

已知问题

在安装过程中,EULA 接受对话框在小于预期窗口中显示许可条款。

Razor 视图没有 IntelliSense 支持,也没有语法突出显示。 预计 Visual Studio 中对 Razor 语法的支持将作为更高版本的一部分包含在内。

编辑 Razor 视图(CSHTML 文件)时, Visual Studio 中的“转到控制器”菜单项将不可用,并且没有代码片段。

使用 @model 语法指定强类型 CSHTML 视图时,无法识别类型的特定于语言的快捷方式。 例如, @model int 将不起作用,但 @model Int32 将正常工作。 此 bug 的解决方法是在指定模型类型时使用实际类型名称。

使用 @model 语法指定强类型 CSHTML 视图(或 @ModelType 指定强类型 VBHTML 视图)时,不支持可为 null 的类型和数组声明。 例如, @model 不支持 int? 相反,使用 @model Nullable<Int32>。 @model语法字符串[] 也不受支持;请改用 @model IList<string>

将 ASP.NET MVC 2 项目升级到 ASP.NET MVC 3 时,请确保将以下内容添加到 Web.config 文件的 appSettings 部分:

<appSettings>
  <add key="enableSimpleMembership" value="false" />
</appSettings>

存在一个已知问题,导致表单身份验证始终将未经身份验证的用户重定向到 ~/Account/Login,忽略 Web.config 中使用的表单身份验证设置。解决方法是添加以下应用设置。

<add key="autoFormsAuthentication" value="false" />

免责声明

© 2011 Microsoft Corporation。 保留所有权利。 本文档“按原样”提供。本文档中表达的信息和观点(包括 URL 和其他 Internet 网站引用)如有更改,恕不另行通知。 您自行承担其使用风险。

本文档未向您提供任何 Microsoft 产品中任何知识产权的任何合法权利。 您可为了内部参考目的复制和使用本文档。