Share via


クエリ文字列値を使用してモデル バインドと Web フォームを使用してデータをフィルター処理する

Tom FitzMacken

このチュートリアル シリーズでは、ASP.NET Web Forms プロジェクトでモデル バインドを使用する基本的な側面について説明します。 モデル バインドを使用すると、データ ソース オブジェクト (ObjectDataSource や SqlDataSource など) を処理するよりも、データの操作が簡単になります。 このシリーズは入門資料から始まり、後のチュートリアルでより高度な概念に移ります。

このチュートリアルでは、クエリ文字列に値を渡し、その値を使用してモデル バインドを使用してデータを取得する方法について説明します。

このチュートリアルは、シリーズの の部分で作成されたプロジェクトに基づいています。

完全なプロジェクトは C# または VB で ダウンロード できます。 ダウンロード可能なコードは、Visual Studio 2012 または Visual Studio 2013で動作します。 Visual Studio 2012 テンプレートを使用します。これは、このチュートリアルで示すVisual Studio 2013 テンプレートとは若干異なります。

作成する内容

このチュートリアルでは、次のことについて説明します。

  1. 学生の登録済みコースを表示する新しいページを追加する
  2. クエリ文字列の値に基づいて、選択した学生の登録済みコースを取得します
  3. グリッド ビューから新しいページにクエリ文字列値を含むハイパーリンクを追加する

このチュートリアルの手順は、ドロップダウン リストのユーザー選択に基づいて表示される学生をフィルター処理するために、前の チュートリアル で行った手順とよく似ています。 このチュートリアルでは、select メソッドの Control 属性を使用して、パラメーター値がコントロールから取得されることを指定しました。 このチュートリアルでは、select メソッドの QueryString 属性を使用して、パラメーター値がクエリ文字列から取得されることを指定します。

学生のコースを表示するための新しいページを追加する

Site.master マスター ページを使用する新しい Web フォームを追加し、ページに Courses という名前を付けます。

Courses.aspx ファイルで、グリッド ビューを追加して、選択した学生のコースを表示します。

<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
    <asp:GridView runat="server" ID="coursesGrid"
        ItemType="ContosoUniversityModelBinding.Models.Enrollment"
        SelectMethod="coursesGrid_GetData" AutoGenerateColumns="false">
        <Columns>
            <asp:BoundField HeaderText="Title" DataField="Course.Title" />
            <asp:BoundField HeaderText="Credits" DataField="Course.Credits" />
            <asp:BoundField HeaderText="Grade" DataField="Grade" />
        </Columns>
        <EmptyDataTemplate>
            <asp:Label Text="No Enrolled Courses" runat="server" />
        </EmptyDataTemplate>
    </asp:GridView>
</asp:Content>

select メソッドを定義する

Courses.aspx.cs では、グリッド ビューの SelectMethod プロパティで指定した名前の select メソッドを追加します。 このメソッドでは、学生のコースを取得するためのクエリを定義し、パラメーターが パラメーターと同じ名前のクエリ文字列値から取得されるように指定します。

まず、次の using ステートメントを追加する必要があります。

using ContosoUniversityModelBinding.Models;
using System.Web.ModelBinding;
using System.Data.Entity;

次に、Courses.aspx.cs に次のコードを追加します。

public IQueryable<Enrollment> coursesGrid_GetData([QueryString] int? studentID)
{
    SchoolContext db = new SchoolContext();
    var query = db.Enrollments.Include(e => e.Course)
        .Where(e => e.StudentID == studentID);
    return query;
}

QueryString 属性は、StudentID という名前のクエリ文字列値がこのメソッドの パラメーターに自動的に割り当てられることを意味します。

Students.aspx のグリッド ビューで、新しいコース ページにリンクするハイパーリンク フィールドを追加します。 ハイパーリンクには、学生の ID を含むクエリ文字列値が含まれます。

Students.aspx で、[合計クレジット] フィールドのすぐ下のグリッド ビュー列に次のフィールドを追加します。

<asp:TemplateField HeaderText="Total Credits">  
    <ItemTemplate>
        <asp:Label Text="<%# Item.Enrollments.Sum(en => en.Course.Credits) %>" 
            runat="server" />
    </ItemTemplate>
</asp:TemplateField>
<asp:HyperLinkField Text="Courses" DataNavigateUrlFormatString="~/Courses.aspx?StudentID={0}"
    DataNavigateUrlFields="StudentID" />

アプリケーションを実行し、グリッド ビューに [コース] リンクが含まれていることに注意してください。

ハイパーリンクの追加

リンクの 1 つをクリックすると、その学生の登録済みコースが表示されます。

コースの表示

まとめ

このチュートリアルでは、クエリ文字列値を含むリンクを追加しました。 select メソッドのパラメーター値に対して、そのクエリ文字列値を使用しました。

次の チュートリアルでは、分離コード ファイルからビジネス ロジック レイヤーとデータ アクセス層にコードを移動します。