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

时间:2008-12-12 16:15:33

标签: asp.net-mvc model-view-controller 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 } );

有没有办法获得路线名称,例如上面例子中的“Debug”?我想在控制器的OnActionExecuting中访问它,这样我就可以在调试时在ViewData中设置东西,例如,在URL前加上/ debug /...

6 个答案:

答案 0 :(得分: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;
    }
}

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

routes.MapRouteWithName(
    "myRouteName",
    "{controller}/{action}/{username}",
    new { controller = "Home", action = "List" }
    );

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

RouteData.DataTokens["RouteName"]

希望有所帮助。

答案 1 :(得分:2)

如果使用如下所示的标准MapRoute设置:

routes.MapRoute(    name: "Default",
                    url: "{controller}/{action}/{id}",
                    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }

...这将在视图中起作用...

var routeName = Url.RequestContext.RouteData.Values["action"].ToString();

答案 2 :(得分:1)

您可以使用附加参数的默认值传递路径名称:

routes.MapRoute(
    name: "MyRoute",
    url: "{controller}/{action}/{id}",
    defaults: new { routeName = "MyRoute", controller = "Home", action = "Index", id=UrlParameter.Optional }
);

然后,可以从控制器上下文传递值:

string routeName = ControllerContext.RouteData.Values["routeName"].ToString();

答案 3 :(得分:0)

另一种解决方案可能是使用解决方案配置:

protected override OnActionExecuting()
{
    #if DEBUG

        // set up stuff in the ViewData

    #endif

    // continue
}

实际上不应该像这样引用路由名称 - 我想这就是为什么MVC会让这种事情变得如此困难。

答案 4 :(得分:0)

这不直接回答问题(如果你想迂腐);但是,真正的目标似乎是在给定路由名称的情况下获取路由的基本URL。所以,这就是我做到的:

我的路线在RouteConfig.cs中定义为:

routes.MapRoute(
            name: "MyRoute",
            url: "Cont/Act/{blabla}",
            defaults: new { controller = "Cont", action = "Act"}
        );

获取路线的基本网址:

var myRoute = Url.RouteUrl("MyRoute", new { blabla = "blabla" }).Replace("blabla", "");

它为我提供了我想要的路由基本网址:

/Cont/Act/

希望这有帮助。

答案 5 :(得分:-1)

另一个选项 - 使用MapRoute和string [] namespaces参数,然后你可以看到你的命名空间为RouteData.DataTokens["Namespaces"]