SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Scott Guthrie氏 Blog翻訳

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でないかをチェックし、必要な型に変換し、その変換が成功かどうかをチェックするなどです。ページングやソートをこれと統合するとなると(編集のサポートは除外して)より一層複雑になります。モデルバインディングシステムは、このようなコードを書く必要性を減少させることが目的で、必要なときはアプリケーションを通じてクリーンに再利用できるようにします。

次のページ
コントロールを使用したフィルタリング

この記事は参考になりましたか?

Scott Guthrie氏 Blog翻訳連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト Chica(チカ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Scott Guthrie(Scott Guthrie)

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/6289 2011/12/05 11:31

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー