Проблема с конфликтами маршрутов MVC - PullRequest
0 голосов
/ 26 июля 2011

У меня есть многоязычное приложение MVC, которое, помимо прочего, имеет несколько простых страниц «CMS», которые обрабатываются контроллером страниц. Маршрут, который я определил:

routes.MapRoute(
    "Page",
    "Page/{name}",
    new { controller = "Page", action = "Index", name = "" }
);

Также у меня есть метод, определенный в «базовом контроллере», который используется для изменения языка текущей страницы.

public ActionResult ChangeCulture(Culture lang, string returnUrl)
{
    if (returnUrl.Length >= 3)
    {
        returnUrl = returnUrl.Substring(3);
    }

    return Redirect("/" + lang.ToString() + returnUrl);
}

Например, для страницы «О нас» на английском языке испанская версия доступна по следующему URL: http://localhost/en/Page/ChangeCulture?lang=2&returnUrl=/es/Page/AboutUs

Проблема в том, что этот URL отображается на маршрут, который я определил для страниц CMS, который, очевидно, не существует. Есть ли способ, которым я могу игнорировать URL «Page / ChangeCulture», чтобы он соответствовал правильному методу, то есть указанному в «базовом контроллере»?

Спасибо

Jose

Ответы [ 2 ]

0 голосов
/ 26 июля 2011

Вы должны перепроектировать свои URL.Почему испанская версия страницы «О нас» размещается в разных URL-адресах?В вашем примере:

  1. http://localhost/en/Page/ChangeCulture?lang=2&returnUrl=/es/Page/AboutUs
  2. http://localhost/es/Page/AboutUs

Заставьте каждую страницу работать на любом языке с единообразным URL (в этом примеревторой).Тогда ваша маршрутизация будет выглядеть так:

    routes.MapRoute(
    "Page",
    "{lang}/Page/{name}",
    new { controller = "Page", lang = "en", action = "Index", name = "" }
);

, и вы даже можете позвонить RedirectToaction вместо Redirect и использовать более надежную форму построения URL.например:

RedirectToAction("Index", new { page = "AboutUS", lang = "es" } );
0 голосов
/ 26 июля 2011

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

routes.MapRoute(
                "Page",
                "Page/{name}",
                new { controller = "Page", action = "Index", name = "" },
                new { name = new PageNameConstraint() }
                );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...