Asp.Net MVC MapRoute с дополнительным сегментом языкового URL-адреса

#asp.net #url #routing #segment

#asp.net #url #маршруты #сегмент

Вопрос:

У меня есть ASP.Net Приложение MVC со следующим отображением маршрутов:

 context.MapRoute("Empty","", new { controller = "Home", action = "Index" });
context.MapRoute("Info","/Info", new { controller = "Info", action = "Index" });
context.MapRoute("Base","/Info/Base", new { controller = "Info", action = "Base" });
  

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

 www.something.com/en
www.something.com/en/Info
www.something.com/en/Info/Base
  

Я легко достигаю этого, добавляя параметр LanguageCode в URL:

 context.MapRoute("Empty","/{languageCode}", new { controller = "Home", action = "Index" });
context.MapRoute("Info","/{languageCode}/Info", new { controller = "Info", action = "Index" });
context.MapRoute("Base","/{languageCode}/Info/Base", new { controller = "Info", action = "Base" });
  

К сожалению, этот параметр должен быть необязательным. Но когда я пропускаю его в URL-адресе под этими маршрутами — у меня ошибка 404.

Есть идеи, как это реализовать? Добавление LanguageCode = UrlParameter.Необязательный не помогает, он работает, только если необязательный параметр является конечным URL.

Ответ №1:

Добавьте обе конфигурации маршрута (с и без languageCode ), и вы получите желаемое поведение

 context.MapRoute("Empty","/{languageCode}", new { controller = "Home", action = "Index" });
context.MapRoute("Info","/{languageCode}/Info", new { controller = "Info", action = "Index" });
context.MapRoute("Base","/{languageCode}/Info/Base", new { controller = "Info", action = "Base" });
context.MapRoute("Empty","", new { controller = "Home", action = "Index" });
context.MapRoute("Info","/Info", new { controller = "Info", action = "Index" });
context.MapRoute("Base","/Info/Base", new { controller = "Info", action = "Base" });
  

Примечание

Следующая конфигурация аналогична вашей, но содержит меньше кода конфигурации (но она также предоставит доступ ко всем другим контроллерам)

 routes.MapRoute(
    name: "LanguageCode",
    url: "{languageCode}/{controller}/{action}",
    defaults: new { controller = "Home", action = "Index" }
);

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index" }
);
  

Комментарии:

1. Спасибо, очень полезно. Моя проблема заключалась в упорядочении MapRoutes. За каждым «определяемым языком» должно следовать «не определяемое языком».