MVC 3 HyphenatedRouteHandler несовместим с областями и повторяющимися именами контроллеров

Я довольно новичок в MVC3, но я потратил немало времени на изучение и тестирование, и я не могу найти решение. В стеке есть еще один похожий пост, но он остается без ответа спустя 7 месяцев.

Суть вот в чем: если у вас есть области и контроллеры с повторяющимися именами - нет проблем. Если у вас есть области и вы используете HyphenatedRouteHandler — нет проблем. Если вы попытаетесь использовать области, повторяющиеся имена контроллеров и обработчик маршрута через дефис, вы получите ошибку:

Было найдено несколько типов, соответствующих контроллеру с именем «продукты». Это может произойти, если маршрут, который обслуживает этот запрос ('{controller}/{action}/{id}'), не указывает пространства имен для поиска контроллера, соответствующего запросу. Если это так, зарегистрируйте этот маршрут, вызвав перегрузку метода «MapRoute», который принимает параметр «пространства имен».

Я также должен добавить, что я получаю сообщение об ошибке на корневом контроллере, а не на контроллере в пределах области. Например, /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 }
        );
    }
}

person jstafford    schedule 28.07.2011    source источник
comment
Пробовали ли вы добавить в свой маршрут для вашей области пространство имен области, как вы сделали это для своего маршрута по умолчанию в Global.asax.cs?   -  person counsellorben    schedule 28.07.2011
comment
Я добавил это, так что теперь это выглядит так   -  person jstafford    schedule 28.07.2011
comment
public override void RegisterArea (контекст AreaRegistrationContext) { context.MapRoute ( Admin_default, Admin/{controller}/{action}/{id}, new {controller = Home, action = Index, id = UrlParameter.Optional }, new[] { МойПроект.Области.Администраторы.Контроллеры } ); } но не повезло - я все еще получаю ту же ошибку, когда попадаю на корневую страницу / продукты.   -  person jstafford    schedule 28.07.2011


Ответы (1)


Вам нужно указать область в вашем HyphenatedRouteHandler :

requestContext.RouteData.DataTokens["area"] = requestContext.RouteData.Values["area"].ToString().Replace('-', '_');

person YTZGuy    schedule 05.08.2011
comment
Спасибо за ответ! У меня не было возможности проверить это, так как мне в основном приходилось обойти это. Как только я закончу свой проект, я вернусь назад и протестирую его, но пока отмечу его как ответ, так как он выглядит правильно. - person jstafford; 30.08.2011