View テンプレートを使用したコントローラーからモデルのデータへのアクセス

作成者: Rick Anderson

Note

ASP.NET MVC 5 と Visual Studio 2013 を使用するこのチュートリアルの更新バージョンは、こちらで入手できます。 より安全で、より簡単に操作でき、より多くの機能を備えています。

このセクションでは、新しい MoviesController クラスの作成、ムービー データを取得するコードの記述、View テンプレートを使用したブラウザーへの表示を行います。

次の手順に進む前に、アプリケーションをビルドします

Controllers フォルダーを右クリックし、新しい MoviesController コントローラーを作成します。 以下のオプションは、アプリケーションをビルドするまで表示されません。 次のオプションを選択します。

  • コントローラー名: MoviesController。 (これは既定値です。)
  • テンプレート: Entity Framework を使用した読み取り/書き込みアクションとビューがある MVC コントローラー
  • モデル クラス: Movie (MvcMovie.Models)
  • データ コンテキスト クラス: MovieDBContext (MvcMovie.Models)
  • ビュー: Razor (CSHTML)。 (既定値。)

AddScaffoldedMovieController

追加をクリックします。 Visual Studio Express では、次のファイルとフォルダーが作成されます。

  • プロジェクトの Controllers フォルダー内の MoviesController.cs ファイル。
  • プロジェクトの Views フォルダー内の Movies フォルダー。
  • 新しい Views\Movies 内の Create.cshtml、Delete.cshtml、Details.cshtml、Edit.cshtmlIndex.cshtml

MVC 4 ASP.NET でアクション メソッドとビュー (CRUD アクション メソッドとビューの自動作成はスキャフォールディングと呼ばれます) 向けのCRUD (作成、読み取り、更新、削除) が自動的に作成されました。 これで、ムービー エントリの作成、一覧表示、編集、削除が可能な、完全な機能を備えた Web アプリケーションができました。

アプリケーションを実行し、ブラウザーのアドレス バーの URL に /Movies を追加して Movies コントローラーを参照します。 アプリケーションは既定のルーティング (Global.asax ファイルで定義) に依存しているため、ブラウザー要求 http://localhost:xxxxx/MoviesMovies コントローラーの既定の Index アクション メソッドにルーティングされます。 言い換えると、ブラウザー要求 http://localhost:xxxxx/Movies は実質的にブラウザー要求 http://localhost:xxxxx/Movies/Indexと 同じです。 まだ追加していないため、結果はムービーの空のリストになります。

Screenshot that shows the M V C Movie Index page.

ムービーの作成

[Create New](新規作成) リンクを選択します。 ムービーに関する詳細を入力し、[作成] ボタンをクリックします。

Screenshot that shows the M V C Movie Create page.

[作成] ボタンをクリックすると、ムービー情報がデータベースに保存されているサーバーにフォームが送信されます。 その後、/Movies URL にリダイレクトされ、新しく作成されたムービーが一覧に表示されます。

IndexWhenHarryMet

いくつかのムービー エントリを作成します。 [編集]、[詳細]、および [削除] リンクを試してください。すべて機能します。

生成されたコードの確認

Controllers\MoviesController.cs ファイルを開いて、生成された Index メソッドを調べます。 Index メソッドを使用したムービー コントローラーの一部を以下に示します。

public class MoviesController : Controller
{
    private MovieDBContext db = new MovieDBContext();

    //
    // GET: /Movies/

    public ActionResult Index()
    {
        return View(db.Movies.ToList());
    }

前に説明したように、MoviesController クラスの次の行ではムービー データベース コンテキストがインスタンス化されます。 ムービーのクエリ、編集、削除を行うために、ムービー データベース コンテキストを使用できます。

private MovieDBContext db = new MovieDBContext();

Movies コントローラーへの要求は、ムービー データベースの Movies テーブル内のすべてのエントリを返し、結果を Index ビューに渡します。

厳密に型指定されたモデルと @model キーワード

このチュートリアルの前半で、コントローラーで ViewBag オブジェクトを使用してデータやオブジェクトをビュー テンプレートに渡す方法を示しました。 ViewBag は動的オブジェクトであり、ビューに情報を渡すための便利な遅延バインディングの方法を提供します。

ASP.NET MVC では、厳密に型指定されたデータまたはオブジェクトをビュー テンプレートに渡す機能も提供されています。 この厳密に型指定されたアプローチにより、コードのコンパイル時のチェックが向上し、Visual Studio エディターでの IntelliSense が豊富になります。 Visual Studio のスキャフォールディング メカニズムは、メソッドとビューを作成するときに、MoviesController クラスとビュー テンプレートでこの方法を使いました。

Controllers\MoviesController.cs ファイルで、生成された Details メソッドを調べてください。 Details メソッドを使用したムービー コントローラーの一部を以下に示します。

public ActionResult Details(int id = 0)
{
    Movie movie = db.Movies.Find(id);
    if (movie == null)
    {
        return HttpNotFound();
    }
    return View(movie);
}

Movie が見つかった場合、Movie モデルのインスタンスが [詳細] ビューに渡されます。 Views\Movies\Details.cshtml ファイルの内容を確認してください。

ビュー テンプレート ファイルの先頭に @model ステートメントを含めることで、ビューが期待するオブジェクトの型を指定することができます。 ムービー コントローラーを作成したとき、Visual Studio によって Details.cshtml ファイルの先頭に @model ステートメントが自動的に追加されています。

@model MvcMovie.Models.Movie

この @model ディレクティブにより、厳密に型指定された Model オブジェクトを使って、コントローラーがビューに渡したムービーにアクセスできます。 たとえば、Details.cshtml テンプレートでは、コードで厳密に型指定された Model オブジェクトを使って、DisplayNameFor および DisplayFor HTML ヘルパーに各ムービー フィールドを渡しています。 また、Create メソッド、Edit メソッド、およびビュー テンプレートもムービー モデル オブジェクトを渡します。

Index.cshtml ビュー テンプレートと MoviesController.cs ファイルの Index メソッドを確認してください。 Index アクション メソッドで View ヘルパー メソッドを呼び出すときの List オブジェクトの作成方法に注意してください。 次に、コードでは、この Movies リストをコントローラーからビューに渡します。

public ActionResult Index()
{
    return View(db.Movies.ToList());
}

ムービー コントローラーを作成したとき、Visual Studio Express によって Index.cshtml ファイルの先頭に @model ステートメントが自動的に追加されています。

@model IEnumerable<MvcMovie.Models.Movie>

この @model ディレクティブにより、厳密に型指定された Model オブジェクトを使って、コントローラーがビューに渡したムービーのリストにアクセスできます。 たとえば、Index.cshtml テンプレートのコードでは、foreach ステートメントを使って厳密に型指定された Model オブジェクトのムービーをループ処理しています。

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Title)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.ReleaseDate)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Genre)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Price)
        </td>
         <th>
            @Html.DisplayFor(modelItem => item.Rating)
        </th>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
            @Html.ActionLink("Details", "Details", { id=item.ID })  |
            @Html.ActionLink("Delete", "Delete", { id=item.ID }) 
        </td>
    </tr>
}

Model オブジェクトは (IEnumerable<Movie> オブジェクトとして) 厳密に型指定されているので、ループ内の各 item オブジェクトは Movie として型指定されます。 その他の利点として、コード エディターでコードのコンパイル時チェックと IntelliSense の完全なサポートが得られることがあります。

ModelIntelliSense

SQL Server LocalDB の使用

Entity Framework Code First は、提供されたデータベース 接続文字列がまだ存在しない Movies データベースを指していることを検出したため、Code First はデータベースを自動的に作成しました。 App_Data フォルダーを確認することで、作成されたことを確認できます。 Movies.mdf ファイルが表示されない場合は、[ソリューション エクスプローラー] ツール バーの [すべてのファイルを表示] ボタンをクリックし、[更新] ボタンをクリックして、App_Data フォルダーを展開します。

Screenshot that shows the Solution Explorer window. The Show All Files icon is circled in red and the App Data folder is selected.

Movies.mdf をダブルクリックして [データベース エクスプローラー] を開き、[テーブル]フォルダーを展開してムービー テーブルを表示します。

DB_explorer

Note

データベース エクスプローラーが表示されない場合は、[ツール] メニューから [データベースに接続] を選択し、[データ ソースの選択] ダイアログをキャンセルします。 これにより、データベース エクスプローラーが強制的に開きます。

Note

VWD または Visual Studio 2010 を使用していて、次のようなエラーが表示される場合:

  • データベース 'C:\Webs\MVC4\MVCMOVIE\MVCMOVIE\APP_DATA\MOVIES.MDF' はバージョン 706 であるため、開くことができません。 このサーバーではバージョン 655 以前がサポートされます。 このダウングレード パスはサポートされません。
  • "InvalidOperation 例外はユーザー コードによって処理されませんでした" 指定された SqlConnection では、初期カタログが指定されていません。

SQL Server Data ToolsLocalDB をインストールする必要があります。 前のページで指定した MovieDBContext 接続文字列を確認します。

Movies テーブルを右クリックし、[テーブル データの表示] を選択すると、作成したデータが表示されます。

Screenshot that shows the d b o dot Movies Data tab.

Movies テーブルを右クリックし、[テーブル定義を開く] を選択すると、Entity Framework Code First で作成されたテーブル構造が表示されます。

Screenshot that shows the Database Explorer window. Open Table Definition is selected in the Movies right click menu.

Screenshot that shows the d b o dot Movies tab and the Entity Framework Code underneath.

Movies テーブルのスキーマが、前に作成した Movie クラスにどのようにマップされるかに注目してください。 Entity Framework Code First では、Movie クラスに基づいてこのスキーマが自動的に作成されます。

終了したら、MovieDBContext を右クリックし、Close Connection を選択して接続を閉じます。 (接続を閉じていない場合は、次にプロジェクトを実行するときにエラーが発生する可能性があります。)

Screenshot that shows the Database Explorer window. Close Connection is selected in the Movie D B Context right click menu.

これで、データベースと、そこからコンテンツを表示するためのシンプルなリスティング ページが作成されました。 次のチュートリアルでは、スキャフォールディングされたコードの残りの部分を調べ、このデータベースでムービーを検索できる SearchIndex メソッドと SearchIndex ビューを追加します。