2016-03-05 3 views
3

Я создаю веб-сайт MVC5, который должен поддерживать несколько языков. Структура приложения сложна, поэтому я использую только атрибутивную маршрутизацию. RouteConfig.cs очень просто:Настройка ASP.NET MVC Атрибут Маршрутизация для сайта с несколькими языками

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

    routes.MapMvcAttributeRoutes(); 
} 

Я хочу, чтобы сохранить информацию о языке в URL, добавив идентификатор языка после названия сайта. Для английского языка, который является языком по умолчанию, URL-адрес должен оставаться «чистым». Вот пример:

http://test.com/foo/1/bar/2 
http://test.com/de/foo/1/bar/2 

Моя первая попытка была использовать два RoutePrefix атрибуты для каждого контроллера:

[RoutePrefix("foo")] 
[RoutePrefix("{lang}/foo")] 

Но MVC не позволяет использовать более чем один RoutePrefix атрибут для контроллера.

Так что теперь я не использую RoutePrefix атрибуты на всех, и указать полный маршрут для каждого действия контроллера:

[Route("foo/{a}/bar/{b}")] 
[Route("{lang}/foo/{a}/bar/{b}")] 

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

PS. Я устанавливаю текущую культуру потока, анализируя языковой маршрут в пользовательском фильтре.

+1

Посмотрите [этот ответ] (http://stackoverflow.com/questions/32764989/asp-net-mvc-5-culture-in-route-and-url#32839796). Для маршрутизации атрибутов прочитайте комментарии. – NightOwl888

+0

Итак, ваше предложение состоит только в том, чтобы добавить два маршрута для каждого действия? Или я что-то пропустил? –

+0

Вы могли бы: 1) добавить 2 маршрута на одно действие 2) использовать обычную маршрутизацию или 3) проанализировать источник для «MapMvcAttributeRoutes» и создать аналогичный метод, который регистрирует локализованный маршрут для каждого атрибута «Маршрут» (обязательно вызовите свой собственный метод до 'MapMvcAttributeRoutes', чтобы поместить маршруты в RouteTable в правильном порядке). – NightOwl888

ответ

0

Если все остальное терпит неудачу, то я предлагаю вам сохранить ваши маршруты по умолчанию, как это и сохранить язык в качестве параметра запроса

Для английского языка, ваш язык по умолчанию, URL будет оставаться «чистым», как вы хотели.

http://test.com/foo/1/bar/2 

Но для других языков, которые включают в себя lang в качестве параметра запроса

http://test.com/foo/1/bar/2?lang=De-DE 

Затем в пользовательском фильтре, проверьте, если параметр запроса присутствует. Если это - то, измените культуру, чтобы соответствовать. В противном случае используйте язык по умолчанию.

Также: Вы должны использовать кодировку с 5 символами, а не 2-символьный код ISO. De-DE, а не DE или fr-FR, а не FR

+0

Я думал об этом подходе, но я хотел бы сохранить URL как можно более чистым. –

1

Я нашел, что самое легкое решение (по крайней мере для ASP.NET MVC 5.2) - использовать значение по умолчанию для необязательного параметра.

Например, если английский язык по умолчанию, вы можете использовать один атрибут на контроллере:

[RoutePrefix("{lang=en}/foo")] 

или одного атрибута на действии:

[Route("{lang=en}/foo/bar")] 

Обратите внимание, что опция URI параметры (например, {lang?}) не работают, если они находятся в начале URL-адреса.

0

Вы в основном нужны три вещи:

  • многоязычным знают маршрут для обработки входящих запросов (если вы используете MVC5 или выше, вы могли бы также пойти на маршрутизации атрибутов на основе вместо этого, но я по-прежнему предпочитаю использовать глобальное правило для обработки этого).
  • ЛокализацияAttribute для обработки этих многоязычных запросов.
  • Вспомогательный метод для создания этих URL-адресов в вашей заявке (Html.ActionLink и/или Url.Action методов расширения).

Для получения более подробной информации и образцов кода см. this answer.

(оба написаны на C#)

Для получения дополнительной информации и дальнейших проб на эту тему вы также можете прочитать this post.

http://www.ryadel.com/en/html-actionlink-extension-method-written-c-handle-multi-language-routes-asp-net-mvc/