我正在尝试在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, ======"
该路线数据中缺少行动名称。
属性路由中有什么不同吗?我在哪里可以找到行动名称?
感谢您的帮助!
答案 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();
}
}
此示例显示了我们如何获取常规路由数据(如果它与当前上下文匹配),并将其替换为属性路由数据(如果它恰好存在)。