Я перемещаю сайт от ASP.NET MVC 1 до ASP.NET MVC 2. В данный момент сайт поддерживает следующие маршруты:
/{country}/{language}/{controller}/{action}
/{country}/{controller}/{action}
/{language}/{controller}/{action}
/{controller}/{action}
Форматы для country
и language
различимы Regex и имеют подходящие ограничения. В MVC 1 я зарегистрировал каждый из них как отдельный маршрут - для каждой приблизительно из 20 комбинаций. В MVC 2 я пытался заставить то же самое, работающее с одним маршрутом покрывать все четыре случая, с помощью UrlParameter.Optional
, но я, может казаться, не получаю его работа - если я определяю country
и language
как оба дополнительные, затем маршрут /Home/Index
например, успешно не соответствует маршруту. Это - то, что я пытаюсь сделать:
routes.MapRoute("Default",
"{country}/{language}/{controller}/{action}",
new { country = UrlParameter.Optional, language = UrlParameter.Optional,
controller = "Home", action = "Index" },
new { country = COUNTRY_REGEX, language = LANGUAGE_REGEX });
Это просто невозможно, потому что мои optionals в начале маршрута, или я просто пропускаю что-то? Я не могу найти, что любая документация или говорит мне, что я делаю, невозможно или указать на меня в правильном направлении.
Хм. Интересно.
Вот лучшее, что я мог придумать. Я предполагаю, что это плохая идея, но это единственный обходной путь, который я мог придумать. Мне было бы интересно услышать некоторые предложения / проблемы / жалобы.
Вы можете отобразить близорукий маршрут следующим образом:
routes.MapRoute(
"Localized",
"{*loc}",
new { controller = "Localizer", action = "RedirectIt" },
new { loc = REGEX_CONSTRAINT_FOR_ENTIRE_ROUTE_VALUE }
);
Затем, в вашем контроллере Localizer, вы можете перенаправить на нужное действие, как хотите:
public class LocalizerController : Controller
{
public ActionResult RedirectIt(string loc)
{
//split up the loc string
//and determine the correct redirect path for the request
}
}
Я человек дешевых трюков. Что я могу сказать?