【问题标题】:Get Route Data in class在课堂上获取路线数据
【发布时间】:2019-02-06 00:09:50
【问题描述】:

在 MVC 5 中,您可以从

获取 RouteData
HttpContext.Current.Request.RequestContext.RouteData

在 MVC 6 中,我想获取 RouteData,我必须从以下位置访问它:

IHttpContextAccessor httpContextAccessor

但它没有路由字典属性。

如何在 MVC 6 中做到这一点?

【问题讨论】:

    标签: c# asp.net-core asp.net-core-mvc


    【解决方案1】:

    我在这里找到了解决方案https://github.com/aspnet/Mvc/issues/3826

    string parameter = "action" // or controller
    _httpContextAccessor.HttpContext.GetRouteValue(parameter);
    

    【讨论】:

    • +1 不错的发现!我不知道扩展方法甚至存在。此数据由通过RouterMiddleware 填充的IRoutingFeature 提供支持。除非开发人员想抽象出值的来源(路由与标头等),否则这似乎是我上面在过滤器中显示的优先解决方案。
    【解决方案2】:

    它可以在任何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"];
    

    【讨论】:

    • 我建议添加一些扩展方法,以避免在使用此路由值时出现魔术字符串和运行时强制转换,但我离题了。
    • 我仍然不知道如何从httpContextAccessor 获取它:/
    猜你喜欢
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多