ASP.NET MVC 5.2 中的新增功能

Microsoft

本主题介绍 ASP.NET MVC 5.2、Microsoft.AspNet.MVC 5.2.2ASP.NET MVC 5.2.3 Beta 版的新增功能

软件要求

下载

运行时功能作为 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 的新属性路由扩展性,用户可以执行以下操作:

  1. 支持属性路由的继承。 例如,在以下方案中,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();
        }
    }
    
  2. 自动生成属性路由的路由名称。

    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. 筛选出要查找属性路由的控制器。 我们希望尽快在 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才能获得此支持。