1

私は、アマゾン検索の結果をフィルタリングできるように、ユーザーの選択に基づいてアイテムのリストをフィルタリングする機能を持つサイトで作業しています。私は、どのようなものも必要とされない、多くのさまざまなパラメータを受け入れることができるルートを構築する方法がわかりません。MVC多くのオプションパラメータをルーティングする

理想的には、最終的な結果は次のようになります。

  1. mysite.com/dothings/filter1/sometext/filter5/sometext/filter11/sometext

  1. これらの両方のため

    mysite.com/dothings/filter1:sometext/filter5:sometext/filter11:sometext

、私はランダムなランダムフィルタを/処理するためにルートを設定する方法を理解していませんフィルタの順序付け。

//the real code would have 10+ filters 
[Route("filter1/{filter1}/filter2/{filter2}")] 
public IActionResult DoThings(string filter1 = null, string filter2 = null) 
{ 
    return Ok("Test"); 
} 

それでも、オプションのパラメータで、私はfilter1を残せば、それは全く自分の行動に当たらない:

現在、私のコードはただです。

このタイプの要件に共通するアプローチはありますか?

答えて

2

フィルタを外したときにアクションに当たっていない理由は、フィルタをルートの一部として使用しているためです。

あなたはfilter1 = null; filter2 = "foo"を持っている場合、これはシナリオです:

  • は期待:../filter1/{filter1}/filter2/{filter2}
  • 実際に:../filter1/filter2/foo

代わりに使用すると、クエリパラメータを使用する必要があります。その後、クエリは次のようになります。

mysite.com/dothings?filter1=sometext & filter5 = sometext & filter11 = sometext

とルートは次のようになります。

[Route("DoThings")] 
public IActionResult DoThings(string filter1 = null, string filter2 = null) 
{ 
    return Ok("Test"); 
} 

また、これには10個以上のパラメータがあると述べたので、フィルタのクラスを作成することをお勧めします。例:ここでは

[Route("DoThings")] 
public IActionResult DoThings(MyFilters filters) 
{ 
    return Ok("Test"); 
} 

public class MyFilters 
{ 
    public string filter1 { get; set; } 
    public string filter2 { get; set; } 
    ... 
} 

は、いくつかの関連の質問は以下のとおりです。

1

@fqhvが指摘したように最初の選択肢は、クエリ文字列パラメータを使用することです。それらはであり、経路の一部であるではないため、あなたのパスにマッチし、任意の組み合わせで、任意の順序で提供することができます。そのアプローチがうまくいかない状況は、ユーザーまたは検索エンジンに適したURLを作成しようとしている場合だけです。

また、経路値の組み合わせのすべての順列を達成するためにextension methods that dynamically build routesを作成することもできます。

関連する問題