Freigeben über


Neuigkeiten in ASP.NET MVC 5.2

von Microsoft

In diesem Thema werden die Neuerungen in ASP.NET MVC 5.2, Microsoft.AspNet.MVC 5.2.2 und ASP.NET MVC 5.2.3 Beta beschrieben.

Softwareanforderungen

Herunterladen

Die Laufzeitfeatures werden als NuGet-Pakete im NuGet-Katalog veröffentlicht. Alle Laufzeitpakete folgen der Spezifikation für die semantische Versionsverwaltung . Das neueste ASP.NET MVC 5.2-Paket weist die folgende Version auf: "5.2.0". Sie können diese Pakete über NuGet installieren oder aktualisieren. Das Release enthält auch entsprechende lokalisierte Pakete in NuGet.

Sie können die veröffentlichten NuGet-Pakete mithilfe der NuGet-Paket-Manager-Konsole installieren oder aktualisieren:

Install-Package Microsoft.AspNet.Mvc -Version 5.2.0

Dokumentation

Tutorials und weitere Informationen zu ASP.NET MVC 5.2 finden Sie auf der ASP.NET-Website (https://www.asp.net/mvc).

Neue Features in ASP.NET MVC 5.2

Verbesserungen beim Attributrouting

Attributrouting bietet jetzt einen Erweiterbarkeitspunkt namens IDirectRouteProvider, der die vollständige Kontrolle darüber ermöglicht, wie Attributrouten ermittelt und konfiguriert werden. Ein IDirectRouteProvider ist dafür verantwortlich, eine Liste von Aktionen und Controllern zusammen mit zugehörigen Routeninformationen bereitzustellen, um genau anzugeben, welche Routingkonfiguration für diese Aktionen gewünscht wird. Beim Aufrufen von MapAttributes/MapHttpAttributeRoutes kann eine IDirectRouteProvider-Implementierung angegeben werden.

Das Anpassen von IDirectRouteProvider ist am einfachsten, indem wir unsere Standardimplementierung DefaultDirectRouteProvider erweitern. Diese Klasse stellt separate überschreibbare virtuelle Methoden bereit, um die Logik zum Ermitteln von Attributen, zum Erstellen von Routeneinträgen und zum Ermitteln von Routenpräfixen und Bereichspräfixen zu ändern.

Mit der neuen Erweiterbarkeit des Attributroutings von IDirectRouteProvider kann ein Benutzer folgendes tun:

  1. Unterstützung der Vererbung von Attributrouten. Im folgenden Szenario verwenden Beispielsweise Blog- und Store-Controller eine Attributroutenkonvention, die vom BaseController definiert wird.

    [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. Automatisches Generieren von Routennamen für Attributrouten.

    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. Ändern Sie Routenpräfixe an einer zentralen Stelle, bevor die Routen der Routingtabelle hinzugefügt werden.

  4. Filtern Sie die Controller heraus, nach denen das Attributrouting suchen soll. Wir hoffen, bald auf 3 und 4 zu blogten.

Facebook Korrekturen für die geänderte API-Oberfläche

Das MVC-Facebook-Paket wurde aufgrund einiger API-Änderungen von Facebook beschädigt. Wir veröffentlichen auch ein neues Facebook-Paket (Microsoft.AspNet.Facebook 1.0.0), um diese Probleme zu beheben.

Bekannte Probleme und Breaking Changes

Das Gerüstbau von MVC/Web-API in ein Projekt mit 5.2.0-Paketen führt zu 5.1.2-Paketen für Pakete, die noch nicht im Projekt vorhanden sind.

Durch das Aktualisieren von NuGet-Paketen für ASP.NET MVC 5.2.0 werden die Visual Studio-Tools wie ASP.NET Gerüstbau oder die Projektvorlage ASP.NET Webanwendung nicht aktualisiert. Sie verwenden die vorherige Version der ASP.NET Runtimepakete (z. B. 5.1.2 in Update 2). Daher installiert das ASP.NET Gerüstbau die vorherige Version (z. B. 5.1.2 in Update 2) der erforderlichen Pakete, sofern diese nicht bereits in Ihren Projekten verfügbar sind. Das ASP.NET Gerüstbau in Visual Studio 2013 RTM oder Update 1 überschreibt jedoch nicht die neuesten Pakete in Ihren Projekten. Wenn Sie ASP.NET Gerüstbau nach dem Aktualisieren der Pakete Ihrer Projekte auf Web-API 2.2 oder ASP.NET MVC 5.2 verwenden, stellen Sie sicher, dass die Versionen der Web-API und ASP.NET MVC konsistent sind.

Microsoft.jQuery.Unobtrusive.Validation NuGet-Paketinstallation schlägt fehl, da es keine Version von Microsoft.jQuery.Unobtrusive.Validation finden kann, die mit jQuery 1.4.1 kompatibel ist

Microsoft.jQuery.Unobtrusive.Validation erfordert jQuery >=1.8 und jQuery.Validation >=1.8. jQuery.Validation (1.8) benötigt jedoch jQuery (≥ 1.3.2 && ≤ 1.6). Wenn NuGet JQuery 1.8 und jQuery.Validation 1.8 gleichzeitig installiert, tritt daher ein Fehler auf. Wenn dieses Problem angezeigt wird, können Sie einfach die Version von jQuery.Validation auf >= 1.8.0.1 aktualisieren, wobei zuerst die jQuery-Obergrenze behoben wurde. Sie sollten Microsoft.jQuery.Unobtrusive.Validation installieren können.

Die jquery. Die Validierungs-NuGet-Paketversion 1.13.0 erkennt einige internationale E-Mail-Adressen nicht.

jQuery.Validation NuGet-Paket Version 1.11.1 ist die letzte bekannte Version, die die folgenden gültigen E-Mail-Adressen erkennt. Spätere Versionen können sie möglicherweise nicht erkennen. Beispiel:

E-Mail-Adress-Internationalisierungsstandard (z.B. 用户@domain.com)
EAI + Internationalized Resource Identifiers (IRIs) (z. B. 用户@домен.рф)

Das Problem wird unter gemeldet. https://github.com/jzaefferer/jquery-validation/issues/1222

Syntaxherhebung für Razor-Ansichten in Visual Studio 2013

Wenn Sie auf ASP.NET MVC 5.2 aktualisieren, ohne Visual Studio 2013 zu aktualisieren, erhalten Sie beim Bearbeiten der Razor-Ansichten keine Unterstützung des Visual Studio-Editors für die Syntaxheraushebung. Sie müssen Visual Studio 2013 aktualisieren, um diesen Support zu erhalten.