コントロールを使用したフィルタリング
では、ドロップダウンリストから製品をフィルタリングするために、ユーザーがカテゴリを選択できるようにサンプルを変更しましょう。
これを行うには、タグにドロップダウンリストを追加し、SelectMethodプロパティを通じてコードビハインドファイルにあるGetCategoriesメソッドからデータが取得できるように構成します。
<asp:DropDownList ID="category" SelectMethod="GetCategories"
AppendDataBoundItems="true" AutoPostBack="true"
DataTextField="CategoryName" DataValueField="CategoryID"
runat="server">
<asp:ListItem Value="" Text="(All)" />
</asp:DropDownList>
<asp:GridView ID="productsGrid" SelectMethod="GetProducts" DataKeyNames="ProductID"
AllowPaging="true" AllowSorting="true" AutoGenerateColumns="false" runat="server">
<Columns>
<asp:BoundField DataField="ProductID" HeaderText="ID" />
<asp:BoundField DataField="ProductName" HeaderText="Name" SortExpression="ProductName" />
<asp:BoundField DataField="UnitPrice" HeaderText="Unit Price" SortExpression="UnitPrice" />
<asp:BoundField DataField="UnitsInStock" HeaderText="# in Stock" SortExpression="UnitsInStock" />
</Columns>
</asp:GridView>
その後、コードビハインドファイルに、新しいGetCategoriesメソッド(DropDownListコントロールを紐づけるためのもの)と、更新されたGetProductsメソッドを追加します。これによりDropDownListで選択されたカテゴリに基づいてフィルタリングされます。
public partial class Products : Page
{
Northwind db = new Northwind();
//
// Select method for DropDownList
public IEnumerable<Category> GetCategories()
{
return db.Categories.ToList();
}
//
// Select method for GridView
public IQueryable<Product> GetProducts([Control] int? category)
{
IQueryable<Product> query = db.Products;
if (categoryId.HasValue)
{
query = query.Where(p => p.CategoryID == category);
}
return query;
}
}
上記では、Nullableカテゴリをパラメータとして取れるようにGetProductsメソッドを変更していることに注意してください。そして、カテゴリパラメータ上の[Control]属性を使用して、DropDownListコントロールの『category』という値にバインドしています。その後、GetProductsメソッド内で、デフォルト(すべて)の値が選択されているかどうか、またDropDownListからすべてでない項目が選択されている場合は指定されたカテゴリにフィルタリングされたものだけが選択されているかどうかをチェックしています。
モデルバインディングシステムは、パラメータの値を追跡して、それらがポストバックで変更されたものかを確認するためのメソッドを選択します。もしそうであれば、自動的に関連しているデータコントロールが、自分自身を再バインドするようにします。これにより、長いコードを書くことなく、またWebフォームページのライフサイクルについて熟知する必要なく、必要な時だけバインドするページを簡単に構築できるようになります。
これでページをもう一度実行すると、DropDownListでデフォルト(すべて)オプションを選択して、すべての製品を表示したり、また選択されたカテゴリにより製品をフィルタリングしたりできます。
ソートやページングは、フィルタリングしているかどうかに関わらず、自動で有効になっています(これはデータベース内で行われているので効率的です)。
モデルバインディングとフィルタリングのQuick Video
Damian Edwards氏は、モデルバインディングにより、フィルタリングできるGridViewシナリオを実装するため方法を、90秒ビデオで公開しています。それは、ここから見れます。
まとめ
ASP.NET vNextの新しいモデルバインディングは、既存のWebフォームのデータバインディングシステムをうまく進化させたものです。これにより、コードにフォーカスしたデータアクセスの枠組みを使用することで、ユーザーの入力に基づいてデータをフィルタリングすることが簡単になります。
次の投稿で、モデルバインディングを使用した編集シナリオについてみていきます。
Hope this helps,
Scott
P.S. ブログ以外に、Twitterを使って簡単な更新やリンク共有を行っています。私のハンドル名は、@scottguです。
