クエリ文字列パラメータを使用したフィルタリング
では、アプリケーションにいくつか基本的なフィルタリングを追加してみましょう。具体的には、製品名にキーワードが含まれているかどうかで、ユーザーが製品結果をフィルタリングできるようにします。クエリ文字列パラメータを使って、キーワードを設定します。例えば、以下では名前に『chef』という言葉が入った製品だけを表示するようにします。
もしキーワードが指定されていなければ、以前のようにすべての製品が表示されるようにします。
GetProductsメソッドの更新
フィルタリングを有効化するために、以下のように、キーワードパラメータが取れるようにGetProductsメソッドを更新します。
public IQueryable<Product> GetProducts([QueryString]string keyword)
{
IQueryable<Product> query = db.Products;
if (!String.IsNullOrWhiteSpace(keyword))
{
query = query.Where(p => p.ProductName.Contains(keyword));
}
return query;
}
もしキーワードがないかNullの場合、メソッドはデータベースにあるすべての製品を返します。もしキーワードが設定されていれば、そのキーワードが名前に含まれている製品だけが表示されるように、クエリ結果をさらにフィルタリングします。
Value Providerの理解
上記のコードで1つお気づきになる点が、キーワードメソッド引数に適用した[QueryString]属性だと思います。これは、モデルバインディングシステムが、必要に応じて型変換も行い、実行時にそのクエリ文字列からの値をこのパラメータに『バインド』させるものです。
ユーザーの値のこれらのソースを、『Value Provider』と呼び、どのValue Providerを使用するのかを、モデルバインディングシステムに指示するパラメータ属性を、『Value Provider Attributes』と呼びます。次期バージョンのWebフォームは、Webフォームアプリケーションでユーザーが入力に使用するすべてのValue Provider(クエリ文字列、クッキー、フォームの値、コントロール、ViewState、セッション、プロフィールなど)と、それぞれに対応した属性とが一緒に渡されます。Value Providerをカスタマイズすることも可能です。カスタマイズしたValue Providerは、WebフォームでもMVCでも動作します。
デフォルトでは、パラメータ名は、Value Providerコレクションのキーとして使用されるので、今回のケースでは、~/Products.aspx?keyword=chefのように、クエリ文字列の中でキーとなる『keyword』のあるものが値になります。これは、パラメータ属性の引数として引き渡すキーを簡単にオーバーライドできます。
例えば、よくある『q』というクエリ文字列を、キーワードの指定に使用します。
public IQueryable<Product> GetProducts([QueryString("q")]string keyword)
そうすると、クエリ文字列を通じてキーワードを引き渡すことで、表示された結果をフィルタリングできます。
もしこれを今までどおりに行おうとすると、非常に長いコードになります。値を読み込んで、Nullでないかをチェックし、必要な型に変換し、その変換が成功かどうかをチェックするなどです。ページングやソートをこれと統合するとなると(編集のサポートは除外して)より一層複雑になります。モデルバインディングシステムは、このようなコードを書く必要性を減少させることが目的で、必要なときはアプリケーションを通じてクリーンに再利用できるようにします。
