Я довольно новичок в MVC3, но я потратил довольно много времени на изучение этого и тестирование, и я не могу найти решение. Есть еще один аналогичный пост в стеке, но он остается без ответа через 7 месяцев.
Суть в том, что: если у вас есть области и контроллеры с повторяющимися именами - нет проблем. Если у вас есть области и вы используете HyphenatedRouteHandler - нет проблем. Если вы попытаетесь использовать области, дублирующиеся имена контроллеров и обработчик дефисных маршрутов, вы получите ошибку:
Найдено несколько типов, соответствующих контроллеру с именем 'products'
Это может произойти, если маршрут, обслуживающий этот запрос
('{controller} / {action} / {id}')) не указывает пространства имен для поиска
для контроллера, который соответствует запросу. Если это так,
зарегистрируйте этот маршрут, вызвав перегрузку метода MapRoute
который принимает параметр 'namespaces'.
Я должен также добавить, я получаю сообщение об ошибке на корневом контроллере, но не на контроллере в этой области. Например, / products НЕ работает, но / admin / products РАБОТАЕТ.
Буду вечно благодарен за конкретное решение !! Код выглядит так:
Global.asax
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
var route = routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
new[] { "MyProject.Controllers" }
);
route.RouteHandler = 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);
}
}
AdminAreaRegistration.cs
public class AdminAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "Admin";
}
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
"Admin_default",
"Admin/{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}