Webフォームモデルバインディング パート2:データのフィルタリング (ASP.NET vNextシリーズ)
連載:ScottGu's Blog翻訳
クエリ文字列パラメータを使用したフィルタリング
では、アプリケーションにいくつか基本的なフィルタリングを追加してみましょう。具体的には、製品名にキーワードが含まれているかどうかで、ユーザーが製品結果をフィルタリングできるようにします。クエリ文字列パラメータを使って、キーワードを設定します。例えば、以下では名前に『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でないかをチェックし、必要な型に変換し、その変換が成功かどうかをチェックするなどです。ページングやソートをこれと統合するとなると(編集のサポートは除外して)より一層複雑になります。モデルバインディングシステムは、このようなコードを書く必要性を減少させることが目的で、必要なときはアプリケーションを通じてクリーンに再利用できるようにします。
この記事は参考になりましたか?
- この記事の著者
-
WINGSプロジェクト Chica(チカ)
<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書、記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
-
この記事は参考になりましたか?
この記事をシェア
