Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Asp.Net MVC MapRoute с необязательным языковым сегментом URL

Автор вопроса: user3603578Ответов: 1

У меня есть приложение 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.Optional не помогает, оно работает, только если необязательным параметром является конечный URL.

urlroutingsegment

Ответы

Ответ 1 · Alexander

Добавьте обе конфигурации маршрута (с 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" }
);

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы