ASP.NET Маршрут MVC на страницу с данными маршрута или без них

#asp.net-mvc #routes

Вопрос:

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

  1. www.mysite.com/home/products?запрос=телефон
  2. www.mysite.com/en/home/products?запрос=телефон

Оба маршрута должны отвечать страницей результатов на английском языке.

У меня есть эти 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/[контроллер]/[действие]»)] [Маршрут(«[контроллер]/[действие]»)] домашний контролер открытого класса : Базовый контролер