Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

allow hyphens in URLs for asp.net mvc 2 controller names

[ActionName("about-us")]
public ActionResult EditDetails(int id)
{
    // your code
}

The above works for actions but I would like to be able to do the same (or similar) for controllers, ie have a hyphen in the URL name too. Is there any easy way to achieve this (I tried the ActionName attribute but no luck)

like image 392
Dkong Avatar asked Mar 12 '11 08:03

Dkong


3 Answers

Easiest way would be adding a custom route:

routes.MapRoute("RouteName", "controler-name/{action}/{id}", new { controller = "ControllerName", action = "Index", id = "" });

I haven't seen a controller name attribute like that before although it may be possible.

like image 80
bkaid Avatar answered Nov 13 '22 07:11

bkaid


You can use custom route handler to give you needed functionality:

public class HyphenatedRouteHandler : MvcRouteHandler
{
    protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        requestContext.RouteData.Values["controller"] = requestContext.RouteData.Values["controller"].ToString().Replace("-", "_");
        requestContext.RouteData.Values["action"] = requestContext.RouteData.Values["action"].ToString().Replace("-", "_");

        return base.GetHttpHandler(requestContext);
    }
}

And the route should be registered using that handler:

var route = routes.MapRoute(
    "Some Action",
    "{controller}/{action}/{id}"
);

route.RouteHandler = new HyphenatedRouteHandler();

There is a similar quastion asked here: ASP.net MVC support for URL's with hyphens

like image 3
Anatoliy 'TLK' Kolesnick Avatar answered Nov 13 '22 09:11

Anatoliy 'TLK' Kolesnick


Hyphenated route in the route table should be before the default route.

routes.MapRoute(
                  "InformationAbout", 
                  "information-about/{action}/{id}", 
                   new { controller = "InformationAbout", action = "Index", id = "" }
                );

 routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional }
like image 1
Yousuf Qureshi Avatar answered Nov 13 '22 08:11

Yousuf Qureshi