MVC 3 HyphenatedRouteHandler не совместим с областями и дублирующимися именами контроллеров - PullRequest
1 голос
/ 28 июля 2011

Я довольно новичок в 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 }
        );
    }
}

1 Ответ

1 голос
/ 06 августа 2011

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

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

...