Мне нужно указать маршруты, специфичные для языка для моего приложения ASP.NET MVC. Язык должен быть частью Url Path (http://myapp/en/Blog), а когда он пропущен, язык по умолчанию должен использоваться.Asp.Net MVC локализация маршрутов с использованием языка по умолчанию
http://myapp/en/Blog -> Блог в английской версии http://myapp/Blog -> Блог в По умолчанию (португальский) Языковая версия
Для решения этой проблемы я создал два Routes ниже:
routes.MapRoute(
name: "Default.lang",
url: "{lang}/{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
constraints: new { lang = @"^[a-zA-Z]{2}$" }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
Маршруты работают как и ожидалось, но я получаю странные результаты, когда я пытаюсь использовать метод Url.RouteUrl для получения альтернативных URL-адресов.
Пример 1 - Путь:/
url.Action("Index", "Blog") // returns "/Blog" that is OK
url.Action("Index", "Blog", new { lang = "en" }); // returns "/en/Blog" that is also OK
Пример 2 - Путь:/ан
url.Action("Index", "Home") // returns "/en/Blog" (??????????) Not OK
url.Action("Index", "Home", new { lang = "en" }); // returns "/en/Blog" that is OK
Как вы можете видеть, что я получаю неверный результат, когда я получить доступ к URL http://myappurl/en и попытайтесь использовать метод Url.Action без прохождения какого-либо значения маршрута (тот же результат с Url.RouteUrl)
Кто-нибудь знает, что не так с моими маршрутами?
[EDIT] Я не уверен, связана ли проблема с маршрутом, потому что я проверил маршруты, используя «en» в качестве ограничения первого маршрута, и получил тот же результат.
Я вижу, что порядок вашего «MapRoute» имеет тенденцию выполнять сначала «Default.lang», а не «Default». Попробуйте изменить маршрут, установив «Default» в верхнем порядке и посмотрите, какая будет маршрутизация. –
Ограничение маршрута Default.lang позволяет избежать скрытия маршрута по умолчанию. При смене порядка будет скрыт маршрут Default.lang. Спасибо @Tetsuya Yamamoto –