ASP.NET MVC 5.2 中的新增功能
本主题介绍 ASP.NET MVC 5.2、Microsoft.AspNet.MVC 5.2.2 和 ASP.NET MVC 5.2.3 Beta 版的新增功能
软件要求
- Visual Studio 2012:下载 ASP.NET 和 Web 工具 2013.1 for Visual Studio 2012。
- Visual Studio 2013:下载Visual Studio 2013更新或更高版本。 编辑 MVC 5.2 Razor 视图 ASP.NET 需要此更新。
下载
运行时功能作为 NuGet 库上的 NuGet 包发布。 所有运行时包都遵循 语义版本控制 规范。 最新的 ASP.NET MVC 5.2 包具有以下版本:“5.2.0”。 可以通过 NuGet 安装或更新这些包。 该版本还包括 NuGet 上的相应本地化包。
可以使用 NuGet 包管理器控制台安装或更新已发布的 NuGet 包:
Install-Package Microsoft.AspNet.Mvc -版本 5.2.0
文档
有关 ASP.NET MVC 5.2 的教程和其他信息,请参阅 ASP.NET 网站 (https://www.asp.net/mvc) 。
ASP.NET MVC 5.2 中的新功能
属性路由改进
属性路由现在提供一个名为 IDirectRouteProvider 的扩展点,它允许完全控制如何发现和配置属性路由。 IDirectRouteProvider 负责提供操作和控制器列表以及关联的路由信息,以指定这些操作所需的确切路由配置。 调用 MapAttributes/MapHttpAttributeRoutes 时,可以指定 IDirectRouteProvider 实现。
通过扩展默认实现 DefaultDirectRouteProvider,自定义 IDirectRouteProvider 将是最容易的。 此类提供单独的可重写虚拟方法,用于更改用于发现属性、创建路由条目和发现路由前缀和区域前缀的逻辑。
使用 IDirectRouteProvider 的新属性路由扩展性,用户可以执行以下操作:
支持属性路由的继承。 例如,在以下方案中,Blog 和 Store 控制器使用 BaseController 定义的属性路由约定。
[InheritedRoute("attributerouting/{controller}/{action=Index}/{id?}")] public abstract class BaseController : Controller { } public class BlogController : BaseController { public string Index() { return "Hello from blog!"; } } public class StoreController : BaseController { public string Index() { return "Hello from store!"; } } [AttributeUsage(AttributeTargets.Class, Inherited=true, AllowMultiple=true)] public class InheritedRouteAttribute : Attribute, IDirectRouteFactory { public InheritedRouteAttribute(string template) { Template=template; } public string Name { get; set; } public int Order { get; set; } public string Template { get; private set; } public new RouteEntry CreateRoute(DirectRouteFactoryContext context) { // context.Actions will always contain at least one action - and all of the // actions will always belong to the same controller. var controllerDescriptor=context.Actions.First().ControllerDescriptor; var template=Template.Replace("{controller}", controllerDescriptor.ControllerName); IDirectRouteBuilder builder=context.CreateBuilder(template); builder.Name=Name; builder.Order=Order; return builder.Build(); } } // Custom direct route provider which looks for route attributes of type // InheritedRouteAttribute and also supports attribute route inheritance. public class InheritedDirectRouteProvider : DefaultDirectRouteProvider { protected override IReadOnlyList<IDirectRouteFactory> GetControllerRouteFactories(ControllerDescriptor controllerDescriptor) { return controllerDescriptor .GetCustomAttributes(typeof(InheritedRouteAttribute), inherit: true) .Cast<IDirectRouteFactory>() .ToArray(); } }
自动生成属性路由的路由名称。
protected override IReadOnlyList<IDirectRouteFactory> GetActionRouteFactories(ActionDescriptor actionDescriptor) { // Get all the route attributes decorated directly on the actions IReadOnlyList<IDirectRouteFactory> actionRouteFactories=base.GetActionRouteFactories(actionDescriptor); // Check if the route attribute on each action already has a route name and if no, // generate a route name automatically // based on the convention: <ControllerName>_<ActionName> (ex: Customers_GetById) foreach (IDirectRouteFactory routeFactory in actionRouteFactories) { RouteAttribute routeAttr=routeFactory as RouteAttribute; if (string.IsNullOrEmpty(routeAttr.Name)) { routeAttr.Name=actionDescriptor.ControllerDescriptor.ControllerName + "_" + actionDescriptor.ActionName; } } return actionRouteFactories; } protected override IReadOnlyList<IDirectRouteFactory> GetControllerRouteFactories(ControllerDescriptor controllerDescriptor) { // Get all the route attributes decorated directly on the controllers IReadOnlyList<IDirectRouteFactory> controllerRouteFactories=base.GetControllerRouteFactories(controllerDescriptor); // Check if the route attribute on each controller already has a route name and if no, // generate a route name automatically // based on the convention: <ControllerName>Route (ex: CustomersRoute) foreach (IDirectRouteFactory routeFactory in controllerRouteFactories) { RouteAttribute routeAttr=routeFactory as RouteAttribute; if (string.IsNullOrEmpty(routeAttr.Name)) { routeAttr.Name=controllerDescriptor.ControllerName + "Route"; } } return controllerRouteFactories; }
在将路由添加到路由表之前,在一个中心位置修改路由前缀。
筛选出要查找属性路由的控制器。 我们希望尽快在 3 和 4 上发布博客。
更改的 API 图面的Facebook修复
MVC Facebook包因Facebook进行了很少的 API 更改而损坏。 我们还 (Microsoft.AspNet.Facebook 1.0.0) 发布新的Facebook包来解决这些问题。
已知问题和中断性变更
将 MVC/Web API 基架到具有 5.2.0 包的项目中,对于项目中尚不存在的包,将生成 5.1.2 个包
更新 ASP.NET MVC 5.2.0 的 NuGet 包不会更新 Visual Studio 工具,例如 ASP.NET 基架或 ASP.NET Web 应用程序项目模板。 它们使用以前版本的 ASP.NET 运行时包 (,例如 Update 2) 中的 5.1.2。 因此,ASP.NET 基架将安装以前的版本 (例如 Update 2 中的 5.1.2) 所需包(如果这些版本在项目中尚不可用)。 但是,Visual Studio 2013 RTM 或 Update 1 中的 ASP.NET 基架不会覆盖项目中的最新包。 如果在将项目的包更新到 Web API 2.2 或 ASP.NET MVC 5.2 后使用 ASP.NET 基架,请确保 Web API 和 ASP.NET MVC 的版本一致。
Microsoft.jQuery.Unobtrusive.Validation NuGet 包安装失败,因为它找不到与 jQuery 1.4.1 兼容的 Microsoft.jQuery.Unobtrusive.Validation 版本
Microsoft.jQuery.Unobtrusive.Validation 需要 jQuery >=1.8 和 jQuery.Validation >=1.8。 但是,jQuery.Validation (1.8) 需要 jQuery (≥ 1.3.2 && ≤ 1.6) 。 因此,当 NuGet 同时安装 JQuery 1.8 和 jQuery.Validation 1.8 时,它将失败。 看到此问题时,只需将 jQuery.Validation 的版本更新为 >= 1.8.0.1 ,该版本首先修复了 jQuery 上限,应能够安装 Microsoft.jQuery.Unobtrusive.Validation。
jquery。验证 nuget 包版本 1.13.0 无法识别某些国际电子邮件地址
jQuery.Validation nuget 包版本 1.11.1 是识别以下有效电子邮件地址的最后一个已知版本。 任何更高版本可能无法识别它们。 例如:
电子邮件地址国际化 (EAI) 标准 (,例如 用户@domain.com)
EAI + 国际化资源标识符 (I RI) (例如 ,用户@домен.рл)
报告此问题的 https://github.com/jzaefferer/jquery-validation/issues/1222
Visual Studio 2013 中 Razor 视图的语法突出显示
如果在未更新Visual Studio 2013的情况下更新到 ASP.NET MVC 5.2,则在编辑 Razor 视图时,将不会获得 Visual Studio 编辑器对语法突出显示的支持。 需要更新Visual Studio 2013才能获得此支持。