さまざまなフィルタを使用できる並べ替えの検索を構築しています。ASP.NET MVC 3フィルタリングに対応する複数のルート
これらのフィルタオプションをいいURLにマップしたいのですが、私は自分のルートを設定する際に問題に遭遇しています。これを行うにはより良い方法が必要だと感じています。
私は(例のために)私のFlights
コントローラ上で次のアクションを持っている:
public ActionResult Find(string origin, string destination, DateTime? DepartureDateTime, int? flexibleDays, int? Page, string someValue)
{
//do fun stuff here
}
私は、このアクションにルーティングする次の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)
私は最初の2つのものの順番も同じです。例えば、
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
これらのクエリ文字列パラメータが存在するときではない空/ nullになります。
ここで私が欲しいものを記述したので、ここに私の最初の亀裂があります。基本的に、検索の順列ごとに異なるルートルールを追加し始めました。
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
);
これはほとんどの場合動作しますが、すぐに手を伸ばしています。私が使用しているこの例は単純化されていて、上記の/flexible/{flexibleDays}
のように、さらに多くのクエリ文字列と、さらにいくつかの "URLパラメータ"があるとします。
これに対して、より優れた保守性の高い、より有効な解決策がありますか?または、私は持っているすべてのURLの組み合わせを非常に慎重にマップする必要がありますか?
また、他のURL構造についてのご意見もあります。私はまだ私が指定したルートを設定するより良い方法がある場合、私はまだ興味があります。
ルートはそのようにする必要がありますか?クエリ文字列を使用することもできますか? – melaos
いいえ、そうである必要はありませんが、私はすべてがクエリ文字列であることを本当に望んでいません。私はそれが主観的だと思うが、 'example.com/Flights/From/London/To/Fiji'は' example.com/Flights/?from = London&to = Fiji'よりはるかに読みやすいと思う。 URLは非常に長く複雑になります。 ( 'example.com/Flights?from London =&Auckland&DepartureDateTime = 2011-07-16&flexibleDays = 5&someValue = foo')。私が言及したように、私はいくつかのクエリ文字列を追加する予定ですが、特定のサブセクションに "ドリルダウン"し、さらにその上に追加のフィルタリングを適用できるようにしたいと考えています。 – elwyn