2017-08-02 83 views

回答

1

它可以在任何Filter內提取,儘管它可能在ResourceFilter中最有意義。所有各種過濾器的「*Context」對象都繼承了相同的ActionContext,它具有您要查找的RouteData屬性。從那裏,您可以將它複製到HttpContext上的Items集合(方便地,也可在篩選器的*Context對象上使用),以便在調用管道之後的其他代碼中使用。

下面是一個通過ResourceExecutingContextResourceFilter中提取它的示例。

public class ExtractRouteValueResourceFilter : IAsyncResourceFilter { 

    public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next) { 
     var value = context.RouteData.Values["key"]; 

     if (value != null) { 
      context.HttpContext.Items["key"] = value; 
     } 

     await next(); 
    } 

} 

在你的過濾器後,運行任何代碼,您現在可以通過IHttpContextAccessor訪問路徑值,像這樣:

var routeValue = accessor.HttpContext.Items["key"]; 
+1

我會建議增加一些擴展方法,以及以避免魔術字符串和運行投入使用這個路由值,但我離題了。 – Technetium