2016-10-19 8 views
0

Мне нужно указать маршруты, специфичные для языка для моего приложения 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» в качестве ограничения первого маршрута, и получил тот же результат.

+0

Я вижу, что порядок вашего «MapRoute» имеет тенденцию выполнять сначала «Default.lang», а не «Default». Попробуйте изменить маршрут, установив «Default» в верхнем порядке и посмотрите, какая будет маршрутизация. –

+0

Ограничение маршрута Default.lang позволяет избежать скрытия маршрута по умолчанию. При смене порядка будет скрыт маршрут Default.lang. Спасибо @Tetsuya Yamamoto –

ответ

0

После некоторого копания внутри System.Web.Mvc и System.Web.Routing исходного кода я обнаружил, что такое поведение ожидается. Я предполагаю, что он предназначен для правильной работы в приложениях, работающих внутри виртуальных каталогов.

Это может быть подтверждено в this answer, которое я обнаружил при исследовании, если у кого-то была такая же проблема с виртуальным путем и с разрешением маршрута.

Обход

Использование имени разрешения маршрута с помощью метода Url.RouteUrl, который имеет и другую реализацию и работает, как ожидалось.

Пример:

var blogDefaultUrl = url.RouteUrl("Default", new {action = "Index", controller = "Blog"}); 
var blogLangageSpecifictUrl = url.RouteUrl("Default.lang", new { action = "Index", controller = "Blog", lang = language }); 

я избежать использовать именованные маршруты, потому что мой дизайн приложения является немного более сложным, чем я показал выше. По этой причине я должен обнаружить во время выполнения маршрут, который соответствует Request.Url, и с этой точки я вызываю RouteUrl, чтобы получить URL-адрес альтернативных языков для контента.

Смежные вопросы