2011-07-16 17 views
1

さまざまなフィルタを使用できる並べ替えの検索を構築しています。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構造についてのご意見もあります。私はまだ私が指定したルートを設定するより良い方法がある場合、私はまだ興味があります。

+0

ルートはそのようにする必要がありますか?クエリ文字列を使用することもできますか? – melaos

+0

いいえ、そうである必要はありませんが、私はすべてがクエリ文字列であることを本当に望んでいません。私はそれが主観的だと思うが、 '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

答えて

2

可能なすべての組み合わせについて経路を作成せずに、あなたが望むことを行う方法はありません。カスタムルートを書くことはできますが、それは正確ではありません。基本的に、キーと値の両方がデフォルトを持ち、値が制約を持つことができるキー値のペアを解析します。また、それらの値からURLを構築して戻すことも忘れないでください。/ {文字列}

  • から

    • /{文字列}のキーを指定
    • {日時}(NOキー)
    • フレキシブル/ {INT}(デフォルト値)

    にはDepartureDateTimeはそれを少し簡略化します(=それぞれの値はキーを持ちます)。カスタムルートのURLは"Flights/{p1}/{p2}/{p3}/{p4}/"のようになります。すべてのパラメータのデフォルトはUrlParemeter.Optionalまたは "Flights/{* args}"になります。次に、希望のルート値にGetRouteDataGetVirtualPathのマッピングを行います。

    もう1つの方法は、パラメータに基づいてすべての組み合わせを作成する方法を作成することですが、それらのパラメータを展開する場合は、最終的にパフォーマンスが低下する可能性があります。

  • 0

    痛みを軽くするために、FromとToのアクションメソッドを作成することを検討してください。これにより、ルーティングがいくらか容易になります。

    参考までに、以下のリンクが参考になる場合があります。 http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx

    編集:個人的に私はして、フライトのcontoller上のアクションメソッドから、必要があるだろうとのように適量の変数に残りを渡す:でも、(これはクリーンなあなたのURLを保ちながら少ないルーティングを意味するだろう

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

    +0

    私は 'Flight/From'と' Flight/To'アクションを行い、それ以外の場合は両方のアクションの 'routes.MapRoute'エントリを(本質的に)複製します。両方のアクションのためにルートのすべての組み合わせを指定する必要があるので、これは同じ作業量ではありませんか? – elwyn

    +0

    あなたのルーティングにしたがっていたら、それはすべてを保存しないと思います。個人的には、残ったものに対してqs変数を使用してfromとtoのコントローラアクションを使用します。だからあなたは、フライト/出発地/オークランド出発地=ロンドンに乗ります。これはあなたのマッピングを減らし、まだ清潔で可読です – NinjaNye

    +0

    私はそれが個人的な選択だと思います – NinjaNye

    関連する問題