Я создаю поиск с различными доступными фильтрами.
Я хочу сопоставить эти параметры фильтра с хорошим 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.Хотя мне все еще интересно, есть ли лучший способ настройки маршрутов, которые я указал.