Co nowego w ASP.NET MVC 5.2

autor: Microsoft

W tym temacie opisano nowości dotyczące ASP.NET MVC 5.2, Microsoft.AspNet.MVC 5.2.2 i ASP.NET MVC 5.2.3 Beta

Wymagania programowe

Pobierz

Funkcje środowiska uruchomieniowego są wydawane jako pakiety NuGet w galerii NuGet. Wszystkie pakiety środowiska uruchomieniowego są zgodne ze specyfikacją semantycznego przechowywania wersji . Najnowszy pakiet ASP.NET MVC 5.2 ma następującą wersję: "5.2.0". Te pakiety można instalować lub aktualizować za pomocą narzędzia NuGet. Wydanie zawiera również odpowiednie zlokalizowane pakiety w programie NuGet.

Możesz zainstalować lub zaktualizować wydane pakiety NuGet przy użyciu konsoli Menedżera pakietów NuGet:

Install-Package Microsoft.AspNet.Mvc — wersja 5.2.0

Dokumentacja

Samouczki i inne informacje o ASP.NET MVC 5.2 są dostępne w witrynie internetowej ASP.NET (https://www.asp.net/mvc).

Nowe funkcje w ASP.NET MVC 5.2

Ulepszenia routingu atrybutów

Routing atrybutów udostępnia teraz punkt rozszerzalności o nazwie IDirectRouteProvider, który umożliwia pełną kontrolę nad sposobem odnajdowania i konfigurowania tras atrybutów. Dostawca IDirectRouteProvider jest odpowiedzialny za udostępnienie listy akcji i kontrolerów wraz ze skojarzonymi informacjami o trasie, aby określić dokładnie, jaka konfiguracja routingu jest wymagana dla tych akcji. Implementację IDirectRouteProvider można określić podczas wywoływania atrybutów MapAttributes/MapHttpAttributeRoutes.

Dostosowanie dostawcy IDirectRouteProvider będzie najłatwiejsze przez rozszerzenie domyślnej implementacji DefaultDirectRouteProvider. Ta klasa udostępnia oddzielne metody wirtualne, które można zastąpić, aby zmienić logikę odnajdywania atrybutów, tworzenia wpisów trasy oraz odnajdywania prefiksu trasy i prefiksu obszaru.

Dzięki rozszerzalności routingu nowego atrybutu IDirectRouteProvider użytkownik może wykonać następujące czynności:

  1. Obsługa dziedziczenia tras atrybutów. Na przykład w poniższym scenariuszu kontrolery blogów i magazynów używają konwencji trasy atrybutów, która jest definiowana przez kontroler 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. Automatycznie generuj nazwy tras dla tras atrybutów.

    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. Przed dodaniu tras do tabeli tras zmodyfikuj prefiksy tras w jednym centralnym miejscu.

  4. Odfiltruj kontrolery, na których ma szukać routing atrybutów. Mamy nadzieję, że wkrótce na blogu 3 i 4.

Facebook poprawki zmienionego obszaru interfejsu API

Pakiet Facebook MVC został uszkodzony z powodu kilku zmian interfejsu API wprowadzonych przez Facebook. Udostępniamy również nowy pakiet Facebook (Microsoft.AspNet.Facebook 1.0.0), aby rozwiązać te problemy.

Znane problemy i zmiany powodujące niezgodność

Tworzenie szkieletu wzorca MVC/internetowego interfejsu API w projekcie z pakietami 5.2.0 powoduje utworzenie pakietów 5.1.2 dla pakietów, które jeszcze nie istnieją w projekcie

Aktualizowanie pakietów NuGet dla ASP.NET MVC 5.2.0 nie powoduje zaktualizowania narzędzi programu Visual Studio, takich jak tworzenie szkieletu ASP.NET lub szablon projektu aplikacji internetowej ASP.NET. Używają poprzedniej wersji pakietów środowiska uruchomieniowego ASP.NET (np. 5.1.2 w aktualizacji Update 2). W związku z tym szkielet ASP.NET zainstaluje poprzednią wersję (np. 5.1.2 w aktualizacji Update 2) wymaganych pakietów, jeśli nie są jeszcze dostępne w projektach. Jednak szkielet ASP.NET w Visual Studio 2013 RTM lub Update 1 nie zastępuje najnowszych pakietów w projektach. Jeśli używasz szkieletu ASP.NET po zaktualizowaniu pakietów projektów do internetowego interfejsu API 2.2 lub ASP.NET MVC 5.2, upewnij się, że wersje internetowego interfejsu API i ASP.NET MVC są spójne.

Instalacja pakietu NuGet Microsoft.jQuery.Unobtrusive.Validation kończy się niepowodzeniem, ponieważ nie można odnaleźć wersji pakietu Microsoft.jQuery.Unobtrusive.Validation zgodnej z wersją jQuery 1.4.1

Plik Microsoft.jQuery.Unobtrusive.Validation wymaga biblioteki jQuery >=1.8 i jQuery.Validation >=1.8. Jednak jQuery.Validation (1.8) wymaga jQuery (≥ 1.3.2 && ≤ 1.6). W związku z tym, gdy program NuGet instaluje jednocześnie zestawy JQuery 1.8 i jQuery.Validation 1.8, kończy się niepowodzeniem. Po wyświetleniu tego problemu możesz po prostu zaktualizować wersję pliku jQuery.Validation do >= 1.8.0.1 , która ma naprawiony limit jQuery, należy najpierw zainstalować bibliotekę Microsoft.jQuery.Unobtrusive.Validation.

jquery. Walidacja pakietu NuGet w wersji 1.13.0 nie rozpoznaje niektórych międzynarodowych adresów e-mail

Pakiet nuget jQuery.Validation w wersji 1.11.1 jest ostatnią znaną wersją, która rozpoznaje następujące prawidłowe adresy e-mail. Wszystkie nowsze wersje mogą nie być w stanie ich rozpoznać. Na przykład:

Standard Międzynarodowych adresów e-mail (EAI) (np. 用户@domain.com)
EAI + internationalized Resource Identifiers (IRIs) (np. 用户@домен.рф)

Problem jest zgłaszany pod adresem https://github.com/jzaefferer/jquery-validation/issues/1222

Wyróżnianie składni dla widoków Razor w Visual Studio 2013

Jeśli zaktualizujesz ASP.NET MVC 5.2 bez aktualizowania Visual Studio 2013, nie uzyskasz obsługi edytora programu Visual Studio w celu wyróżniania składni podczas edytowania widoków Razor. Aby uzyskać tę pomoc techniczną, musisz zaktualizować Visual Studio 2013.