53

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/...

4

6 回答 6

75

不幸的是,路线名称未存储在路线中。它只是在 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"]

希望有帮助。

于 2008-12-12T19:22:11.547 回答
3

如果使用如下标准 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();
于 2019-09-06T23:10:07.383 回答
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();
于 2018-05-12T04:25:58.237 回答
0

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

我的路线定义RouteConfig.cs为:

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

并获取路由的基本 URL:

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

它给了我想要的路由的基本 URL:

/Cont/Act/

希望这可以帮助。

于 2016-07-28T11:37:13.403 回答
-1

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

protected override OnActionExecuting()
{
    #if DEBUG

        // set up stuff in the ViewData

    #endif

    // continue
}

真的不需要像这样引用路由名称——我想这就是为什么 MVC 让做这种事情变得如此困难。

于 2012-11-20T21:40:12.530 回答
-2

另一种选择 - 使用带有字符串 [] 命名空间参数的 MapRoute,然后您可以将命名空间视为RouteData.DataTokens["Namespaces"]

于 2011-05-31T14:35:54.133 回答