ASP.NET MVC 2 - должны ли UrlParameter.Optional записи быть в конце маршрута? - PullRequest
7 голосов
/ 10 июня 2010

Я мигрирую сайт с 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 });

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

1 Ответ

2 голосов
/ 15 июня 2010

Хм.Интересно.

Вот лучшее, что я мог придумать.Я предполагаю, что это плохая идея, но это единственный обходной путь, который я мог придумать.Мне было бы интересно услышать некоторые предложения / проблемы / жалобы.

Вы можете сопоставить близорукий маршрут следующим образом:

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
    }
}

Я человек с дешевыми уловками.Что я могу сказать?

...