如何在ASP.NET MVC中获取控制器中的路由名称?

Mik*_*ott 53 model-view-controller asp.net-mvc routing

ASP.NET MVC路由在映射时具有名称:

routes.MapRoute(
    "Debug", // Route name -- how can I use this later????
    "debug/{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = string.Empty } );
Run Code Online (Sandbox Code Playgroud)

有没有办法获取路由名称,例如上面的例子中的"Debug"?我想在控制器的OnActionExecuting中访问它,以便我可以在调试时在ViewData中设置内容,例如,通过在/ debug /前面添加一个URL ...

Nic*_*hac 74

遗憾的是,路径名称未存储在路径中.它仅在MVC内部用作集合中的键.我认为这是你在用HtmlHelper.RouteLink创建链接时仍然可以使用的东西(也许在其他地方,也不知道).

无论如何,我也需要它,这就是我所做的:

public static class RouteCollectionExtensions
{
    public static Route MapRouteWithName(this RouteCollection routes,
    string name, string url, object defaults, object constraints)
    {
        Route route = routes.MapRoute(name, url, defaults, constraints);
        route.DataTokens = new RouteValueDictionary();
        route.DataTokens.Add("RouteName", name);

        return route;
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我可以注册这样的路线:

routes.MapRouteWithName(
    "myRouteName",
    "{controller}/{action}/{username}",
    new { controller = "Home", action = "List" }
    );
Run Code Online (Sandbox Code Playgroud)

在我的Controller操作中,我可以使用以下命令访问路径名称:

RouteData.DataTokens["RouteName"]
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.

  • 很酷的解决方法,虽然看起来像MVC无法访问它的疏忽.你是对的 - 你可以通过指定名称来创建路由链接,因此它存储在某处:-) (4认同)
  • 这首先不是路由名称的目的.该名称旨在使用"路由"生成URL时提供索引,该路径允许您指定要使用的路由.DataTokens确实是这样做的正确方法.例如,假设您有多个"调试"路由.无论如何你不能使用它的名字.但您始终可以创建自己的数据令牌.路由忽略数据令牌但传递它们,因此您的代码可以解释它们的含义. (4认同)