route.GetRouteData(httpContext).Values [" action"]为属性路由为空

时间:2015-02-04 19:25:31

标签: asp.net asp.net-mvc-5 asp.net-mvc-routing httpmodule attributerouting

我正在尝试在HttpModule中获取控制器名称和操作名称。

在我的http模块的OnBeginRequest中,我有以下代码:

foreach (var route in RouteTable.Routes)
{
    if (route.GetRouteData(httpContext) != null)
    {
        Console.WriteLine(string.Format(CultureInfo.InvariantCulture, 
            "Route info ====== {0}, {1} ======", 
            route.GetRouteData(httpContext).Values["controller"], 
            route.GetRouteData(httpContext).Values["action"]));
    }
}

如果使用传统路由注册路由,请执行以下操作:

routes.MapRoute("BlogDetails", "blog/{blogId}", new { controller = "Blog", action = "Details" });

当我去:〜/ blog / 1我可以看到输出

"Route info ====== Blog, Details ======"

但如果是注册使用:

routes.MapMvcAttributeRoutes();

在控制器中我有:

[RouteArea("blog", AreaPrefix = "blog")]
[Route("{action}")]

关于我的行动:[Route("{blogId}", Name="blogDetailRoute")]

当我去:〜/ blog / 1我只看到输出

"Route info ====== Blog,  ======"

该路线数据中缺少行动名称。

属性路由中有什么不同吗?我在哪里可以找到行动名称?

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

属性路由的路由存储在名为IEnumerable<RouteData>的嵌套MS_DirectRouteMatches中。

var routeData = routes.GetRouteData(httpContext);
if (routeData != null)
{
     if (routeData.Values.ContainsKey("MS_DirectRouteMatches"))
     {
          routeData = ((IEnumerable<RouteData>)routeData.Values["MS_DirectRouteMatches"]).First();
     }
}

此示例显示了我们如何获取常规路由数据(如果它与当前上下文匹配),并将其替换为属性路由数据(如果它恰好存在)。