ASP.NET MVC 3 发行说明

概述

本文档介绍 ASP.NET MVC 3 RTM for Visual Studio 2010 的发布。 ASP.NET MVC 是一个框架,用于开发使用模型-视图-控制器 (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 语法。 (有关详细信息,请参阅知识库文章 2483190.)

可在位于 URL 的 ASP.NET 网站上找到 ASP.NET MVC 3 的每个预发行版本的全套发行说明:

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

安装说明

若要使用 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 网站上的以下 URL 上提供了 ASP.NET MVC 的文档:

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

有关 ASP.NET MVC 的教程和其他信息,请参阅 ASP.NET 网站的 MVC 页面,网址为以下 URL:

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 项目解决方案的根目录中的 packages 文件夹复制到解决方案的根目录中,该根目录位于解决方案的 .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) 的引用。

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

    • %ProgramFiles%\ Microsoft ASP.NET\ASP.NET MVC 3\Assemblies
    • %ProgramFiles%\ Microsoft ASP.NET\ASP.NET Web Pages\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 Tools Update 版本中所做的更改。

“添加控制器”对话框现在可以使用视图和数据访问代码创建控制器的基架

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

若要在 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 模型绑定和元数据功能,以便根据在模型类上声明的规则来验证窗体提交。 这包括内置验证规则,例如 必需StringLength 属性,以及自定义验证规则。

  • 一对多关系。 如果您定义模型类之间的一对多外键关系,则生成的代码将生成用于选择相关实体的下拉列表。 例如,您可能会定义下面的后跟“Entity Framework 代码优先”约定的模型类:

    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 代码优先”,则可选择任意模型类。

  • 如果您使用的是“Entity Framework 数据库优先”或“Entity Framework 模型优先”,则一定要选择在您的概念模型中定义的实体类。

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

  • 如果要使用 Code First 并且没有现有数据上下文类,请选择“新建数据上下文”。 然后,将为您生成一个数据上下文类。
  • 如果您想要使用“代码优先”,并且具有一个现有的数据上下文类,则在此处选择该类。 将对它进行更新,以持久保存您已选择的模型类。
  • 如果您使用的是“数据库优先”或“模型优先”,则在此处选择您的对象上下文类。

对于“视图”,请选择您想要使用的视图引擎;或者,如果您不想创建任何视图基架,则选择“无”。

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

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

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

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

新的“Intranet 项目”模板

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

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 的浏览器中支持这些功能。 这个库是作为 ASP.NET MVC 3 项目的模板中预安装的 NuGet 包进行包含的。 有关 Modernizr 的详细信息,请参阅 http://www.modernizr.com/

项目模板包含 jQuery、jQuery UI 和 jQuery Validation 的更新版本

项目模板现在包含 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 包含“代码优先”功能。 “代码优先”是 ADO.NET Entity Framework 的一种新的开发模式,可作为现有的“数据库优先”和“模型优先”模式的替代方案。

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

ASP.NET 网站上的以下 URL 上提供了有关使用代码优先 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

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

当您创建新的 ASP.NET MVC 3 项目时,项目将通过以下方式包括前面所提到的 JavaScript 文件(例如,Modernizr 库):使用 NuGet 安装这些文件,而不是直接将脚本添加到 Scripts 文件夹中的项目模板内容中。 这使您能够使用 NuGet,在发布脚本的新版本时将脚本更新为最新版本。

例如,考虑到经常发布新的 jQuery 版本,项目模板中包含的 jQuery 版本可能会在某个时候过期。 但是,由于 jQuery 是作为已安装的 NuGet 包进行包含的,因此,当有更新的 jQuery 版本可用时,在 NuGet 对话框中将会为您发出通知。

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

ASP.NET MVC 3 中的已知问题

  • 在某些情况下,安装可能会失败,并显示错误消息“安装失败,错误代码 (0x80070643) ”。 有关如何解决此问题的信息,请参阅 知识库文章2531566
  • 用于添加控制器的创建基架功能不会为利用 Entity Framework 内的实体继承支持的实体创建基架。 例如,给定由 Student 类继承的基 Person 类,基架学生类将导致生成不编译的代码。
  • 在解决方案文件夹中创建新的 ASP.NET MVC 3 项目会导致 NullReferenceException 错误。 解决方法是在解决方案的根目录中创建 ASP.NET MVC 3 项目,然后将它移动到所需的解决方案文件夹中。
  • 在安装 ReSharper 时,IntelliSense for Razor 语法不起作用。 如果你已安装 ReSharper,并且想要利用 ASP.NET MVC 3 中的 Razor IntelliSense 支持,请参阅 Hadi Hariri 博客上的条目 Razor Intellisense 和 ReSharper ,其中讨论了今天一起使用它们的方法。
  • 在安装过程中,EULA 接受对话框在一个小于预期的窗口中显示许可条款。
  • 编辑 Razor 视图时, (.cshtml 或 。vbhtml 文件) ,视图。 ASP.NET MVC 3 不包括 Razor 视图的任何代码片段。aspx 选择 ASP.NET MVC 的代码片段将显示 的代码片段
  • 如果在未安装 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()

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

@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 时,IntelliSense for Razor 语法不起作用。 如果你已安装 ReSharper,并且想要利用 ASP.NET MVC 3 中的 Razor IntelliSense 支持,请参阅 Hadi Hariri 博客上的条目 Razor Intellisense 和 ReSharper ,其中讨论了今天一起使用它们的方法。
  • 使用 ASP.NET MVC 3 Beta 版本创建的 CCSHTML 和 VBHTML 视图没有正确设置其生成操作,结果是在发布项目时省略这些视图类型。 这些文件的“生成操作”值应设置为“内容”。 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”

以前,ControllerViewModel 属性对应于视图的 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”属性以支持Engine-Specific文件名

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

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

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

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

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

修复了在模型绑定期间给予显式值优先级的“RenderAction”方法

在早期版本中,在子操作内的模型绑定期间,将忽略传递给 RenderAction 方法的显式值,转而使用当前窗体值。 修复可确保显式值在模型绑定期间优先。

ASP.NET MVC 3 RC2 中的重大更改

  • 在以前版本的 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 中的已知问题

  • 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 时,IntelliSense for Razor 语法不起作用。 如果已安装 ReSharper 并希望利用 ASP.NET MVC 3 RC2 中的 Razor IntelliSense 支持,请参阅 Hadi Hariri 博客上的条目 Razor Intellisense 和 ReSharper ,其中讨论了今天一起使用它们的方法。
  • 使用 ASP.NET MVC 3 Beta 版本创建的 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。 Visual Studio 和 Visual Web Developer Express 共享由 ASP.NET MVC 3 安装程序升级的组件。 如果您在未安装 Visual Web Developer Express 计算机上安装 ASP.NET MVC 3 for Visual Studio,并在以后安装 Visual Web Developer Express,则会出现相同的问题。
  • 安装 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 文件的 Scripts 目录。

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 属性必须与 Password 字段匹配才能有效。

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.RenderAction 或 Html.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 与异步 CTP 一起安装时,调试不起作用。 ASP.NET MVC 3 不能与 Async CTP 并行安装。 卸载 Async CTP 以修复调试。 有关更多详细信息,请阅读 此博客文章 ,了解如何卸载 MVC 3 RC 的所有 ASP.NET。
  • 安装 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 会导致与 Razor 版本发生冲突,该版本包含在 ASP.NET MVC 3 工具安装中。 请确保不要尝试在同一计算机上安装 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 候选版本部分中引用的任何更新或更改的约束。

ASP.NET MVC 3 Beta 版的新功能

本部分介绍 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 发送电子邮件。

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

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

其他依赖项注入支持

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

用于Fine-Grained控制器实例化的新 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 定位符的详细信息,请参阅 GitHub 上的 CommonServiceLocator

用于Fine-Grained视图页面实例化的新 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 的类可以在依赖项解析程序中注册,系统将使用这些类来创建模型绑定系统使用的模型绑定器。

对基于非引人注目的 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 添加了应用程序范围的标志

对不显眼 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 的新Application-Wide标志

可以使用 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 的单个表单域,而其余字段不应允许 HTML。 ValidateInputAttribute 类现在允许指定不应包含在请求验证中的字段列表。

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

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

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

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

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" />

Bug 修复

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

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

JsonValueProviderFactory 现在默认注册。

重大更改

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

已知问题

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

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

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

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

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

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

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

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

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

免责声明

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

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