Partilhar via


Novidades no ASP.NET MVC 5.2

pela Microsoft

Este tópico descreve as novidades para ASP.NET MVC 5.2, Microsoft.AspNet.MVC 5.2.2 e ASP.NET MVC 5.2.3 Beta

Requisitos de software

Baixar

Os recursos de runtime são lançados como pacotes NuGet na galeria do NuGet. Todos os pacotes de runtime seguem a especificação de Controle de Versão Semântico . O pacote mais recente do ASP.NET MVC 5.2 tem a seguinte versão: "5.2.0". Você pode instalar ou atualizar esses pacotes por meio do NuGet. A versão também inclui pacotes localizados correspondentes no NuGet.

Você pode instalar ou atualizar para os pacotes NuGet lançados usando o Console do Gerenciador de Pacotes NuGet:

Install-Package Microsoft.AspNet.Mvc -Versão 5.2.0

Documentação

Tutoriais e outras informações sobre ASP.NET MVC 5.2 estão disponíveis no site do ASP.NET (https://www.asp.net/mvc).

Novos recursos no ASP.NET MVC 5.2

Melhorias de roteamento de atributo

O Roteamento de Atributos agora fornece um ponto de extensibilidade chamado IDirectRouteProvider, que permite controle total sobre como as rotas de atributo são descobertas e configuradas. Um IDirectRouteProvider é responsável por fornecer uma lista de ações e controladores juntamente com informações de rota associadas para especificar exatamente qual configuração de roteamento é desejada para essas ações. Uma implementação IDirectRouteProvider pode ser especificada ao chamar MapAttributes/MapHttpAttributeRoutes.

Personalizar IDirectRouteProvider será mais fácil estendendo nossa implementação padrão, DefaultDirectRouteProvider. Essa classe fornece métodos virtuais substituíveis separados para alterar a lógica para descobrir atributos, criar entradas de rota e descobrir prefixo de rota e prefixo de área.

Com a nova extensibilidade de roteamento de atributo de IDirectRouteProvider, um usuário pode fazer o seguinte:

  1. Suporte à Herança de rotas de atributo. Por exemplo, no cenário a seguir, os controladores blog e store estão usando uma convenção de rota de atributo definida pelo 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. Gere nomes de rota automaticamente para rotas de atributo.

    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. Modifique os prefixos de rota em um local central antes que as rotas sejam adicionadas à tabela de rotas.

  4. Filtre os controladores nos quais você deseja que o roteamento de atributo procure. Esperamos blogar nos dias 3 e 4 em breve.

Facebook correções para a superfície de API alterada

O pacote de Facebook do MVC foi interrompido devido a algumas alterações de API feitas por Facebook. Também estamos lançando um novo pacote de Facebook (Microsoft.AspNet.Facebook 1.0.0) para corrigir esses problemas.

Problemas conhecidos e alterações interruptivas

O scaffolding MVC/API Web em um projeto com pacotes 5.2.0 resulta em pacotes 5.1.2 para os que ainda não existem no projeto

A atualização de pacotes NuGet para ASP.NET MVC 5.2.0 não atualiza as ferramentas do Visual Studio, como ASP.NET scaffolding ou o modelo de projeto ASP.NET Aplicativo Web. Eles usam a versão anterior do ASP.NET pacotes de runtime (por exemplo, 5.1.2 na Atualização 2). Como resultado, o ASP.NET scaffolding instalará a versão anterior (por exemplo, 5.1.2 na Atualização 2) dos pacotes necessários, se eles ainda não estiverem disponíveis em seus projetos. No entanto, o scaffolding ASP.NET em Visual Studio 2013 RTM ou Atualização 1 não substitui os pacotes mais recentes em seus projetos. Se você usar ASP.NET scaffolding depois de atualizar os pacotes de seus projetos para a API Web 2.2 ou ASP.NET MVC 5.2, verifique se as versões da API Web e ASP.NET MVC são consistentes.

A instalação do pacote NuGet Microsoft.jQuery.Unobtrusive.Validation falha porque não é possível encontrar uma versão do Microsoft.jQuery.Unobtrusive.Validation compatível com o jQuery 1.4.1

Microsoft.jQuery.Unobtrusive.Validation requer jQuery >=1.8 e jQuery.Validation >=1.8. Mas jQuery.Validation (1.8) precisa de jQuery (≥ 1.3.2 && ≤ 1.6). Por isso, quando o NuGet instala o JQuery 1.8 e o jQuery.Validation 1.8 ao mesmo tempo, ele falha. Ao ver esse problema, você pode simplesmente atualizar a versão do jQuery.Validation para >= 1.8.0.1 , que tem o limite jQuery corrigido primeiro, você deve ser capaz de instalar Microsoft.jQuery.Unobtrusive.Validation.

O jquery. A versão 1.13.0 do pacote nuget de validação não reconhece alguns endereços de email internacionais

o pacote nuget jQuery.Validation versão 1.11.1 é a última versão conhecida que reconhece os seguintes endereços de email válidos. As versões posteriores podem não ser capazes de reconhecê-las. Por exemplo:

Padrão de EAI (Internacionalização de Endereços de Email) (por exemplo, 用户@domain.com)
EAI + Identificadores de Recursos Internacionalizados (IRIs) (por exemplo, 用户@домен.рф)

O problema é relatado em https://github.com/jzaefferer/jquery-validation/issues/1222

Realce de sintaxe para exibições razor em Visual Studio 2013

Se você atualizar para ASP.NET MVC 5.2 sem atualizar Visual Studio 2013, não obterá suporte do editor do Visual Studio para realce de sintaxe ao editar as exibições do Razor. Você precisará atualizar Visual Studio 2013 para obter esse suporte.