We’re using Areas with a project. And we’re also using this fix to replaces dashes in page names
routes.Add(
new Route("{controller}/{action}/{id}",
new RouteValueDictionary(
new { controller = "Home", action = "Index", id = UrlParameter.Optional }),
new HyphenatedRouteHandler())
);
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);
}
}
This Fix works fine with the normal top level pages. Home/some-page.
But when it comes to an Area this no longer works. I tried modifying the AreaRegistration.cs file to be an equivalent to the Global.asax.cs route but that didn’t work either. I can rename the pages with [ActionName(“some-page”)] but it doesn’t solve the problem of the controller still having underscores Area/some_folder/some-page and I don’t want my URLs to look like that.
Edit:
When I use the route that Darin Dimitrov suggest I get this error:
Multiple types were found that match the controller named ‘page’. This can happen if the route that services this request (‘admin/{controller}/{action}/{id}’) does not specify namespaces to search for a controller that matches the request. If this is the case, register this route by calling an overload of the ‘MapRoute’ method that takes a ‘namespaces’ parameter.
We have multiple “segments” that have the same names but different content to target the segment audience
The following should work in your area registration:
UPDATE:
You seem to be having the same controller name in multiple areas which is not possible without defining a namespace constraint when registering your routes as the error message you are getting suggests you to do.
So in your Global.asax:
and in your AreaRegistration:
You might need to adjust the namespace in the constraint to match yours.