How can I get the route name in controller in ASP.NET MVC?

41,460

Solution 1

The route name is not stored in the route unfortunately. It is just used internally in MVC as a key in a collection. I think this is something you can still use when creating links with HtmlHelper.RouteLink for example (maybe somewhere else too, no idea).

Anyway, I needed that too and here is what I did:

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;
    }
}

So I could register a route like this:

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

In my Controller action, I can access the route name with:

RouteData.DataTokens["RouteName"]

Hope that helps.

Solution 2

If using the standard MapRoute setting like below:

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

...this will work in the view...

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

Solution 3

You could pass route name through route values using default value of additional parameter:

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

Then, it is possible to get passed value from controller context:

string routeName = ControllerContext.RouteData.Values["routeName"].ToString();
Share:
41,460
Mike Scott
Author by

Mike Scott

Software development consultant, ex Delphi TeamB, now C# and .Net enthusiast.

Updated on July 09, 2022

Comments

  • Mike Scott
    Mike Scott almost 2 years

    ASP.NET MVC routes have names when mapped:

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

    Is there a way to get the route name, e.g. "Debug" in the above example? I'd like to access it in the controller's OnActionExecuting so that I can set up stuff in the ViewData when debugging, for example, by prefixing a URL with /debug/...

  • Mike Scott
    Mike Scott over 15 years
    Cool workaround, though it seems like an oversight that MVC doesn't give access to it. You're right - you can create a route link by specifying the name, so it is stored somewhere :-)
  • edoloughlin
    edoloughlin over 13 years
    This isn't the purpose of the route name in the first place. The name is meant to provide an index when generating an URL using Routing that allows you to specify which route to use. DataTokens is really the right way to do that. For example, suppose you have multiple "Debug" routes. You couldn't use name for it anyways. But you can always create your own data tokens. Routing ignores data tokens but passes them along so your code can do the interpretation of what they mean.
  • mare
    mare over 13 years
    still it is an oversight for two reasons: first, people apparently find it useful and second, why does the MapRoute take the name as argument but when constructing a new route with a constructor there is no Name argument in it.
  • GibboK
    GibboK over 12 years
    Here another very similar approach haacked.com/archive/2010/11/28/…
  • JLRishe
    JLRishe over 9 years
    @mare When a framework doesn't include every possible feature that anyone could possibly want, that doesn't equate to an "oversight." And your second reason doesn't make any sense. That's like saying "Why does Dictionary<string, string>.Add() take key as an argument, but when constructing a new string with a constructor there is no key argument in it?" The route name is an identifier for the route. It's not a property of the route.