Question

[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)

Was it helpful?

Solution

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.

OTHER TIPS

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

Maybe this works:

public class CustomControllerFactory : DefaultControllerFactory {

   protected override Type GetControllerType(RequestContext requestContext, string controllerName) {
      return base.GetControllerType(requestContext, controllerName.Replace("-", ""));
   }
}

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 }

May be here is the correct answer to the question. All other are workarounds which work for a single url but this one is a generic approach

http://blog.didsburydesign.com/2010/02/how-to-allow-hyphens-in-urls-using-asp-net-mvc-2/

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top