ASP.NET MVC 3 Несколько маршрутов для размещения фильтрации - PullRequest
1 голос
/ 16 июля 2011

Я создаю поиск с различными доступными фильтрами.

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

У меня на контроллере Flights есть следующее действие (для примера):

public ActionResult Find(string origin, string destination, DateTime? DepartureDateTime, int? flexibleDays, int? Page, string someValue)
{
    //do fun stuff here
}

Iхочу, чтобы все следующие URL-адреса направлялись к этому действию:

example.com/Flights/
example.com/Flights/From/London/
example.com/Flights/To/Fiji/
example.com/Flights/From/London/To/Fiji/
example.com/Flights/From/London/To/Fiji/2011-07-16/    (here I wish a default value of zero be applied to flexibleDays)
example.com/Flights/From/London/To/Fiji/2011-07-16/flexible/   (here I wish a non-zero default value to be set to the flexibleDays parameter)
example.com/Flights/From/London/To/Fiji/2011-07-16/flexible/5/    (here a value is specified for flexibleDays)

Я бы хотел, чтобы порядок первых двух вещей также был обратимым, например:

example.com/Flights/From/London/To/Fiji/
example.com/Flights/To/Fiji/From/London/

КакКроме этих «базовых» URL, я хотел бы иметь возможность добавлять строки запроса:

example.com/Flights/From/London/To/Fiji/2011-07-16/flexible/5/?Page=2&someValue=foobar

Эти параметры строки запроса будут нулевыми / пустыми, если их нет.

Теперь, когда яописал то, что ХОЧУ, вот мой первый треск на этом.По сути, я только начал добавлять разные правила маршрута для каждой перестановки поиска.

routes.MapRoute(
            "Bad1", // Route name
            "Flights/from/{origin}/to/{destination}/{DepartureDateTime}/flexible/{flexibleDays}", // URL with parameters
            new { controller = "Flights", action = "Find", DepartureDateTime = UrlParameter.Optional, flexibleDays = UrlParameter.Optional } // Parameter defaults
        );

        routes.MapRoute(
            "Bad2", // Route name
            "Flights/to/{destination}/from/{origin}/{DepartureDateTime}/flexible/{flexibleDays}", // URL with parameters
            new { controller = "Flights", action = "Find", DepartureDateTime = UrlParameter.Optional, flexible = UrlParameter.Optional } // Parameter defaults
        );

        routes.MapRoute(
            "Bad3", // Route name
            "Flights/from/{origin}/to/{destination}/{DepartureDateTime}/", // URL with parameters
            new { controller = "Flights", action = "Find", DepartureDateTime = UrlParameter.Optional } // Parameter defaults
        );

        routes.MapRoute(
            "Bad4", // Route name
            "Flights/to/{destination}/from/{origin}/{DepartureDateTime}/", // URL with parameters
            new { controller = "Flights", action = "Find", DepartureDateTime = UrlParameter.Optional } // Parameter defaults
        );

        routes.MapRoute(
            "Bad5", // Route name
            "Flights/from/{origin}/{DepartureDateTime}/flexibe/{flexibleDays}", // URL with parameters
            new { controller = "Flights", action = "Find", DepartureDateTime = UrlParameter.Optional, flexible = UrlParameter.Optional } // Parameter defaults
        );

        routes.MapRoute(
            "Bad6", // Route name
            "Flights/to/{destination}/{DepartureDateTime}/flexible/{flexibleDays}", // URL with parameters
            new { controller = "Flights", action = "Find", DepartureDateTime = UrlParameter.Optional, flexible = UrlParameter.Optional } // Parameter defaults
        );

Сейчас это в основном работает, но быстро выходит из-под контроля.Предположим, что этот пример, который я использовал, является упрощенным, и, например, было намного больше строки запроса и еще несколько «параметров URL», таких как /flexible/{flexibleDays}, которые у меня есть выше.

Есть ли лучшее, более удобное в обслуживании и более подходящее для этого решение?Или мне просто нужно очень очень тщательно наметить каждую комбинацию URL, которые я хочу иметь?

Кроме того, я открыт для предложений по поводу других структур URL.Хотя мне все еще интересно, есть ли лучший способ настройки маршрутов, которые я указал.

Ответы [ 2 ]

2 голосов
/ 16 июля 2011

Не существует встроенного способа делать то, что вы хотите, без создания маршрутов для всех возможных комбинаций. Вы можете написать собственный маршрут, но это будет не совсем просто. То, что вы хотите, это в основном анализ пар ключ-значение, где и ключ, и значение могут иметь значение по умолчанию, а значения могут иметь ограничение. Также не забывайте о построении url из этих значений и обратно.

  • из / {строки}
  • в / {строка}
  • {datetime} (без ключа)
  • flex / {int} (значение по умолчанию)

Указание ключа для DepartureDateTime немного упростит его (= каждое значение будет иметь ключ). URL для пользовательского маршрута будет выглядеть как "Flights/{p1}/{p2}/{p3}/{p4}/" и т. Д., Где все параметры будут иметь значение по умолчанию UrlParemeter.Optional или «Полеты / {* args}». Затем вы должны выполнить сопоставление в GetRouteData и GetVirtualPath с требуемыми значениями маршрута.

Другим способом было бы написание метода, который бы создавал все комбинации на основе параметров, но если вы захотите расширить эти параметры, это может в конечном итоге снизить производительность.

0 голосов
/ 16 июля 2011

Чтобы немного облегчить боль, вы можете подумать о создании метода действия От и До. Это сделает вашу маршрутизацию несколько проще.

Для справки может оказаться полезной следующая ссылка. http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx

Редактировать: Лично я должен был бы использовать методы действия «Кому» и «От» на контроллере «Полеты», а остальные передать в виде переменных qs:

/Flights/From/Auckland?to=London
/Flights/To/London?from=auckland

Это будет означать меньше маршрутизации при сохранении чистоты ваших URL (даже с дополнительными параметрами)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...