Области MVC3 как использовать тире в именах страниц - PullRequest
1 голос
/ 06 марта 2012

Мы используем Области с проектом. И мы также используем это исправление для замены черточек в именах страниц

 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);
            }
        }

Это исправление отлично работает с обычными страницами верхнего уровня. Главная / некоторых страниц. Но когда дело доходит до Района, это больше не работает. Я попытался изменить файл AreaRegistration.cs, чтобы он соответствовал маршруту Global.asax.cs, но это тоже не сработало. Я могу переименовать страницы с помощью [ActionName ("some-page")], но это не решает проблему с тем, что у контроллера все еще есть подчеркивание Area / some_folder / some-page, и я не хочу, чтобы мои URL выглядели так.

Edit: Когда я использую маршрут, который предлагает Дарин Димитров, я получаю эту ошибку:

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

У нас есть несколько «сегментов», которые имеют одинаковые имена, но разный контент для целевой аудитории сегмента

1 Ответ

3 голосов
/ 06 марта 2012

Следующее должно работать в вашей области регистрации:

public override void RegisterArea(AreaRegistrationContext context)
{
    context.Routes.Add(
        "Admin_default",
        new Route("Admin/{controller}/{action}/{id}",
            new RouteValueDictionary(
                new { action = "Index", id = UrlParameter.Optional }
            ),
            null,
            new RouteValueDictionary(
                new 
                { 
                    area = AreaName
                }
            ),
            new HyphenatedRouteHandler()
        )
    );
}

UPDATE:

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

Так в вашем Global.asax:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.Add(
        "Default",
        new Route(
            "{controller}/{action}/{id}",
            new RouteValueDictionary(
                new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            ),
            null,
            new RouteValueDictionary(
                new { Namespaces = new[] { "AppName.Controllers" } }
            ),
            new HyphenatedRouteHandler()
        )
    );
}

и в вашей Региональной Регистрации:

public override void RegisterArea(AreaRegistrationContext context)
{
    context.Routes.Add(
        "Admin_default",
        new Route(
            "Admin/{controller}/{action}/{id}",
            new RouteValueDictionary(
                new { action = "Index", id = UrlParameter.Optional }
            ),
            null,
            new RouteValueDictionary(
                new 
                { 
                    Namespaces = new[] { "AppName.Areas.Admin.Controllers" },
                    area = AreaName
                }
            ),
            new HyphenatedRouteHandler()
        )
    );
}

Возможно, вам придется настроить пространство имен в ограничении так, чтобы оно совпадало с вашим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...