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

asp.net MvcModel View-ControllerRouting

asp.net Mvc Problem Overview


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

asp.net Mvc Solutions


Solution 1 - asp.net Mvc

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 - asp.net Mvc

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 - asp.net Mvc

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();

Solution 4 - asp.net Mvc

This does not directly answer the question (if you want to be pedantic); however, the real objective seems to be to get a route's base URL, given a route name. So, this is how I did it:

My route was defined in RouteConfig.cs as:

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

And to get the route's base URL:

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

It gave me the route's base URL that I wanted:

/Cont/Act/

Hope this helps.

Solution 5 - asp.net Mvc

An alternative solution could be to use solution configurations:

protected override OnActionExecuting()
{
    #if DEBUG

        // set up stuff in the ViewData

    #endif

    // continue
}

There shouldn't really ever be a need to reference the route name like this - which I suppose is why MVC makes it so difficult to do this sort of thing.

Solution 6 - asp.net Mvc

another option - use MapRoute with string[] namespaces argument, then you can see your namespaces as RouteData.DataTokens["Namespaces"]

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMike ScottView Question on Stackoverflow
Solution 1 - asp.net MvcNicolas CadilhacView Answer on Stackoverflow
Solution 2 - asp.net MvcAlan ShawView Answer on Stackoverflow
Solution 3 - asp.net MvcAlexanderView Answer on Stackoverflow
Solution 4 - asp.net MvclogicalguyView Answer on Stackoverflow
Solution 5 - asp.net MvcajbeavenView Answer on Stackoverflow
Solution 6 - asp.net MvcМишка КоробковView Answer on Stackoverflow