2017-11-30 6 views
1

AspNetCoreでは、FilterContextが指定されていますが、ルートテンプレートを取得しようとしています。私はからルートテンプレートを得ることができMicrosoft.AspNet.WebApiで {controller}/{action}/{id?}AspNetCore FilterContextからRouteTemplateを取得できますか?

:System.Web.Mvcで HttpControllerContext.RouteData.Route.RouteTemplate

私はからこれを得ることができる:AspNetCoreで ControllerContext.RouteData.Route as RouteBase

があります: FilterContext.ActionDescriptor.AttributeRouteInfo.Template

ただし、すべてのルートが属性ルートであるとは限りません。検査に基づいて

属性が利用できない場合、デフォルトルートおよび/またはマッピングされたルートから組み立てることができます。 FilterContext.RouteData.Routers.OfType<Microsoft.AspNetCore.Routing.RouteBase>().First() が、私は文書または単により良い方法を探しています。

答えて

0

これは組み立てられたバージョンですが、依然としてより良い答えを探しています。

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); 
    } 
} 
関連する問題