2017-11-30 3 views
1

In AspNetCore, mit einem FilterContext, suche ich nach einer Route Vorlage, z. {controller}/{action}/{id?}Kann ich das RouteTemplate von AspNetCore FilterContext erhalten?

In Microsoft.AspNet.WebApi ich die Strecke Vorlage von bekommen konnte: HttpControllerContext.RouteData.Route.RouteTemplate

In System.Web.Mvc Ich konnte dies aus: ControllerContext.RouteData.Route as RouteBase

In AspNetCore gibt es: FilterContext.ActionDescriptor.AttributeRouteInfo.Template

Nicht alle Routen sind jedoch Attributrouten.

Basierend auf Inspektion, wenn das Attribut nicht verfügbar ist, Standardrouten und/oder zugeordneten Routen aus montiert werden: FilterContext.RouteData.Routers.OfType<Microsoft.AspNetCore.Routing.RouteBase>().First() aber ich bin für einen dokumentiert oder einfach bessere Lösung suchen.

Antwort

0

Dies ist die zusammengebaute Version, aber immer noch auf der Suche nach einer besseren Antwort.

FilterContext context; 

string routeTemplate = context.ActionDescriptor.AttributeRouteInfo?.Template; 

if (routeTemplate == null) 
{ 
    // manually mapped routes or default routes 
    // todo is there a better way, not 100% sure that this is correct either 
    // https://github.com/aspnet/Routing/blob/1b0258ab8fccff1306e350fd036d05c3110bbc8e/src/Microsoft.AspNetCore.Routing/Template/TemplatePart.cs 
    IEnumerable<string> segments = context.RouteData.Routers.OfType<Microsoft.AspNetCore.Routing.RouteBase>() 
     .FirstOrDefault()?.ParsedTemplate.Segments.Select(s => string.Join(string.Empty, s.Parts 
      .Select(p => p.IsParameter ? $"{{{(p.IsCatchAll ? "*" : string.Empty)}{p.Name}{(p.IsOptional ? "?" : string.Empty)}}}" : p.Text))); 

    if (segments != null) 
    { 
     routeTemplate = string.Join("/", segments); 
    } 
} 
Verwandte Themen