Я создаю веб-сайт 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. Я устанавливаю текущую культуру потока, анализируя языковой маршрут в пользовательском фильтре.
Посмотрите [этот ответ] (http://stackoverflow.com/questions/32764989/asp-net-mvc-5-culture-in-route-and-url#32839796). Для маршрутизации атрибутов прочитайте комментарии. – NightOwl888
Итак, ваше предложение состоит только в том, чтобы добавить два маршрута для каждого действия? Или я что-то пропустил? –
Вы могли бы: 1) добавить 2 маршрута на одно действие 2) использовать обычную маршрутизацию или 3) проанализировать источник для «MapMvcAttributeRoutes» и создать аналогичный метод, который регистрирует локализованный маршрут для каждого атрибута «Маршрут» (обязательно вызовите свой собственный метод до 'MapMvcAttributeRoutes', чтобы поместить маршруты в RouteTable в правильном порядке). – NightOwl888