#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. За каждым «определяемым языком» должно следовать «не определяемое языком».