Compartir a través de


Novedades de ASP.NET MVC 5.2

de Microsoft

En este tema se describen las novedades de ASP.NET MVC 5.2, Microsoft.AspNet.MVC 5.2.2 y ASP.NET MVC 5.2.3 Beta

Requisitos de software

Descargar

Las características del runtime se publican como paquetes NuGet en la galería de NuGet. Todos los paquetes de runtime siguen la especificación de control de versiones semántico. El último paquete ASP.NET MVC 5.2 tiene la siguiente versión: "5.2.0". Puede instalar o actualizar estos paquetes mediante NuGet. La versión también incluye los paquetes localizados correspondientes en NuGet.

Puede instalar o actualizar los paquetes NuGet publicados mediante la consola del Administrador de paquetes NuGet:

Install-Package Microsoft.AspNet.Mvc -Version 5.2.0

Documentación

Los tutoriales y otra información sobre ASP.NET MVC 5.2 están disponibles en el sitio web de ASP.NET (https://www.asp.net/mvc).

Nuevas características de ASP.NET MVC 5.2

Mejoras en el enrutamiento de atributos

El enrutamiento de atributos ahora proporciona un punto de extensibilidad llamado IDirectRouteProvider, que permite un control total sobre cómo se detectan y configuran las rutas de atributo. IDirectRouteProvider es responsable de proporcionar una lista de acciones y controladores junto con la información de ruta asociada para especificar exactamente qué configuración de enrutamiento se desea para esas acciones. Se puede especificar una implementación de IDirectRouteProvider al llamar a MapAttributes/MapHttpAttributeRoutes.

La personalización de IDirectRouteProvider será más fácil al extender la implementación predeterminada, DefaultDirectRouteProvider. Esta clase proporciona métodos virtuales reemplazables independientes para cambiar la lógica para detectar atributos, crear entradas de ruta y detectar prefijos de ruta y de área.

Con la nueva extensibilidad de enrutamiento de atributos de IDirectRouteProvider, un usuario podría hacer lo siguiente:

  1. Admitir la herencia de rutas de atributo. Por ejemplo, en el siguiente escenario, los controladores Blog y Store usan una convención de ruta de atributo definida por 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. Generar automáticamente nombres de ruta para las rutas 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. Modificar los prefijos de ruta en un lugar central antes de que las rutas se agreguen a la tabla de rutas.

  4. Filtrar los controladores en los que quiera que busque el enrutamiento de atributos. En breve habrá un blog sobre 3 y 4.

Correcciones de Facebook para la superficie de API modificada

El paquete de Facebook de MVC se interrumpió debido a algunos cambios de API realizados por Facebook. También se va a publicar un nuevo paquete de Facebook (Microsoft.AspNet.Facebook 1.0.0) para corregir estos problemas.

Problemas conocidos y cambios importantes

El scaffolding de MVC/Web API en un proyecto con paquetes 5.2.0 da como resultado paquetes 5.1.2 para los que aún no existen en el proyecto

La actualización de paquetes NuGet para ASP.NET MVC 5.2.0 no actualiza las herramientas de Visual Studio, como el scaffolding de ASP.NET o la plantilla de proyecto Aplicación web de ASP.NET. Usan la versión anterior de los paquetes del runtime de ASP.NET (por ejemplo, 5.1.2 en la actualización 2). Como resultado, el scaffolding de ASP.NET instalará la versión anterior (por ejemplo, 5.1.2 en la actualización 2) de los paquetes necesarios, si aún no están disponibles en los proyectos. Pero el scaffolding de ASP.NET en Visual Studio 2013 RTM o la actualización 1 no sobrescribe los paquetes más recientes de los proyectos. Si usa el scaffolding de ASP.NET después de actualizar los paquetes de los proyectos a Web API 2.2 o ASP.NET MVC 5.2, asegúrese de que las versiones de Web API y ASP.NET MVC sean coherentes.

Error en la instalación del paquete NuGet Microsoft.jQuery.Unobtrusive.Validation porque no puede encontrar una versión de Microsoft.jQuery.Unobtrusive.Validation compatible con jQuery 1.4.1

Microsoft.jQuery.Unobtrusive.Validation necesita jQuery >=1.8 and jQuery.Validation >=1.8. Pero jQuery.Validation (1.8) necesita jQuery (≥ 1.3.2 && ≤ 1.6). Debido a esto, se produce un error cuando NuGet instala JQuery 1.8 y jQuery.Validation 1.8 al mismo tiempo. Cuando vea este problema, simplemente puede actualizar la versión de jQuery.Validation a >= 1.8.0.1 que tiene el límite jQuery corregido en primer lugar, debería poder instalar Microsoft.jQuery.Unobtrusive.Validation.

La versión 1.13.0 del paquete NuGet jquery.Validation no reconoce algunas direcciones de correo electrónico internacionales

La versión 1.11.1 del paquete NuGet jQuery.Validation es la última versión conocida que reconoce las siguientes direcciones de correo electrónico válidas. Es posible que las versiones posteriores no puedan reconocerlas. Por ejemplo:

Internacionalización de direcciones de correo electrónico (EAI) estándar (por ejemplo, 用户@domain.com)
EAI e Identificadores de recursos (IRI) internacionalizados (por ejemplo, 用户@домен.рф)

El problema se notifica en https://github.com/jzaefferer/jquery-validation/issues/1222

Resaltado de sintaxis para vistas de Razor en Visual Studio 2013

Si actualiza a ASP.NET MVC 5.2 sin actualizar Visual Studio 2013, no obtendrá compatibilidad con el editor de Visual Studio para el resaltado de sintaxis mientras edita las vistas de Razor. Tendrá que actualizar Visual Studio 2013 para obtener este soporte.