#asp.net-mvc #routes
Вопрос:
Я пытаюсь разработать сайт на 2 языках, и у меня есть требование, чтобы, если значение языкового маршрута не указано, оно должно перейти на страницу с языком по умолчанию. Пример:
Оба маршрута должны отвечать страницей результатов на английском языке.
У меня есть эти 2 маршрута в маршруте регистрации():
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { lang = "en", controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "Default2",
url: "{lang}/{controller}/{action}/{id}",
defaults: new { lang = "en", controller = "Home", action = "Index", id = UrlParameter.Optional }
);
Когда я ищу второй маршрут (www.mysite.com/en/home/products?запрос=телефон) Я получаю ошибку 404.
Где я ошибаюсь?
Спасибо
Ответ №1:
Ваш URL-адрес www.mysite.com/en/home/products?запрос=телефон не работает, потому что движок веб-сайта считает ru контроллером, дом — действием, а продукт-идентификатором.
Если вы проведете некоторое исследование здесь или с помощью Google, вы найдете множество решений своей проблемы, но в каждом из них есть тонны кода для анализа значений маршрута, создания нового URL-адреса и перенаправления. Поэтому, если ваш сайт довольно большой, с сотнями контроллеров, вы можете написать какой-нибудь код. В противном случае, если у вас всего несколько контроллеров, это может быть самым простым способом
[Route("fr/[controller]/[action]")]
[Route("en/[controller]/[action]")]
[Route("[controller]/[action]")]
public class HomeController : Controller
Вместо fr вы должны использовать буквы вашего другого языка. И вам не нужно использовать его для всех контроллеров, он нужен только для контроллеров, где вы можете использовать URL-адрес, который не содержит никакого языка
И оставьте только один маршрут по умолчанию в своей конфигурации и добавьте маршруты MapMvcAttributeRoutes после маршрутов игнорирования
routes.IgnoreRoute(“{resource}.axd/{*pathInfo}”);
routes.MapMvcAttributeRoutes();
routes.MapRoute(
name: "default",
url: "{lang}/{controller}/{action}/{id}",
defaults: new { lang = "en", controller = "Home", action = "Index", id = UrlParameter.Optional }
);
Комментарии:
1. Спасибо, Серж. Я добавил 4 маршрута в верхней части моего контроллера, как вы показали. Но ситуация не улучшилась. Должен ли я также что-то изменить в маршруте регистрации?
2. @Диего Да, я думаю, вам нужно добавить маршруты MapMvcAttributeRoutes . смотрите мой обновленный ответ.
3. Спасибо за ваше время! В любом случае, это не работает. Я получил эту ошибку: «Шаблон маршрута» / «в действии с именем «Индекс» на контроллере с именем » Дом «не может начинаться с прямой косой черты».
4. Ошибка на линейных маршрутах. MapMvcAttributeRoutes(); и на моем домашнем контроллере я получил: [Маршрут(«/»)] [Маршрут(«it/[контроллер]/[действие]»)] [Маршрут(«en/[контроллер]/[действие]»)] [Маршрут(«[контроллер]/[действие]»)] домашний контролер открытого класса : Базовый контролер