コントローラーからモデルのデータにアクセスする (C#)
作成者: Rick Anderson
Note
ASP.NET MVC 5 と Visual Studio 2013 を使用するこのチュートリアルの更新版は、こちらで入手できます。 より安全で、より簡単に操作でき、より多くの機能を備えています。
このチュートリアルでは、Microsoft Visual Web Developer 2010 Express Service Pack 1 (Microsoft Visual Studio の無料版) を使用した ASP.NET MVC Web アプリケーション構築の基本事項を説明します。 開始する前に、以下に示す前提条件がインストールされていることを確認してください。 次のリンクをクリックすると、これらをすべてインストールできます: Web Platform Installer。 また、次のリンクを使用して前提条件となるソフトウェアを個別にインストールすることもできます。
- Visual Studio Web Developer Express SP1 の前提条件
- ASP.NET MVC 3 Tools Update
- SQL Server Compact 4.0 (ランタイム + ツールのサポート)
Visual Web Developer 2010 ではなく Visual Studio 2010 を使用する場合は、Visual Studio 2010 の前提条件のリンクをクリックして、前提条件をインストールします。
このトピックに関連する、Visual Web Developer プロジェクトと C# ソース コードを使用できます。 C# バージョンをダウンロードします。 Visual Basic を使用する場合は、このチュートリアルの Visual Basic バージョンに切り替えてください。
このセクションでは、新しい MoviesController
クラスの作成、ムービー データを取得するコードの記述、ビュー テンプレートを使用したブラウザーへの表示を行います。 先に進む前に、必ずアプリケーションをビルドしてください。
Controllers フォルダーを右クリックし、新しい MoviesController
コントローラーを作成します。 次のオプションを選択します。
- コントローラー名: MoviesController。 (これは既定値です)。
- テンプレート: Entity Framework を使用した、読み取り/書き込みアクションとビューがあるコントローラー。
- モデル クラス: Movie (MvcMovie.Models)。
- データ コンテキスト クラス: MovieDBContext (MvcMovie.Models)。
- ビュー: Razor (CSHTML)。 (既定値)
追加をクリックします。 Visual Web Developer により、次のファイルとフォルダーが作成されます。
- プロジェクトの Controllers フォルダー内の MoviesController.cs ファイル。
- プロジェクトの Views フォルダー内の Movies フォルダー。
- 新しい Views\Movies フォルダー内の Create.cshtml、Delete.cshtml、Details.cshtml、Edit.cshtml、Index.cshtml。
ASP.NET MVC 3 スキャフォールディング メカニズムにより、CRUD (作成、読み取り、更新、削除) アクション メソッドとビューが自動的に作成されました。 これで、ムービー エントリを作成、一覧表示、編集、および削除できる、完全な機能を備えた Web アプリケーションが完成しました。
アプリケーションを実行し、ブラウザーのアドレス バーの URL に /Movies を追加して、Movies
コントローラーを参照します。 アプリケーションは既定のルーティング (Global.asax ファイルで定義) に依存しているため、ブラウザー要求 http://localhost:xxxxx/Movies
は Movies
コントローラーの既定の Index
アクション メソッドにルーティングされます。 つまり、ブラウザー要求 http://localhost:xxxxx/Movies
は実質的にブラウザー要求 http://localhost:xxxxx/Movies/Index
と同じといえます。 まだ何も追加していないため、結果はムービーの空のリストになります。
ムービーの作成
[Create New](新規作成) リンクを選択します。 ムービーに関する詳細を入力し、[作成] ボタンをクリックします。
[作成] ボタンをクリックすると、フォームがサーバーに送信され、そこでムービー情報がデータベースに保存されます。 その後、/Movies URL にリダイレクトされ、新しく作成されたムービーが一覧に表示されます。
いくつかのムービー エントリを作成します。 [編集]、[詳細]、および [削除] リンクを試してください。すべて機能します。
生成されたコードの確認
Controllers\MoviesController.cs ファイルを開いて、生成された Index
メソッドを調べます。 Index
メソッドを含むムービー コントローラーの一部を以下に示します。
public class MoviesController : Controller
{
private MovieDBContext db = new MovieDBContext();
//
// GET: /Movies/
public ViewResult Index()
{
return View(db.Movies.ToList());
}
前に説明したように、MoviesController
クラスの次の行ではムービー データベース コンテキストがインスタンス化されます。 ムービーのクエリ、編集、削除を行うために、ムービー データベース コンテキストを使用できます。
private MovieDBContext db = new MovieDBContext();
Movies
コントローラーへの要求は、ムービー データベースの Movies
テーブル内のすべてのエントリを返し、結果を Index
ビューに渡します。
厳密に型指定されたモデルと @model キーワード
このチュートリアルの前半では、コントローラーで ViewBag
オブジェクトを使用してデータまたはオブジェクトをビュー テンプレートに渡す方法を示しました。 ViewBag
は動的オブジェクトであり、ビューに情報を渡すための便利な遅延バインディングの方法を提供します。
ASP.NET MVC は、厳密に型指定されたデータまたはオブジェクトをビュー テンプレートに渡す機能も提供しています。 この厳密に型指定されたアプローチにより、コードのコンパイル時のチェックが向上し、Visual Web Developer エディターでの IntelliSense が充実したものになります。 このアプローチを、MoviesController
クラスと Index.cshtml ビュー テンプレートで使用します。
コードにより、Index
アクション メソッドで View
ヘルパー メソッドを呼び出すときに List
オブジェクトを作成する方法に注目してください。 次に、コードでは、この Movies
リストをコントローラーからビューに渡します。
public ViewResult Index()
{
return View(db.Movies.ToList());
}
ビュー テンプレート ファイルの先頭に @model
ステートメントを含めると、ビューで必要とされるオブジェクトの型を指定することができます。 ムービー コントローラーを作成したとき、Visual Web Developer は Index.cshtml ファイルの先頭に、次の @model
ステートメントを自動的に含めました。
@model IEnumerable<MvcMovie.Models.Movie>
この @model
ディレクティブにより、厳密に型指定された Model
オブジェクトを使って、コントローラーがビューに渡したムービーのリストにアクセスできます。 たとえば、Index.cshtml テンプレートのコードでは、厳密に型指定された Model
オブジェクトに対して foreach
ステートメントを使って、ムービーをループ処理しています。
@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>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
@Html.ActionLink("Details", "Details", new { id=item.ID }) |
@Html.ActionLink("Delete", "Delete", new { id=item.ID })
</td>
</tr>
}
Model
オブジェクトは (IEnumerable<Movie>
オブジェクトとして) 厳密に型指定されているので、ループ内の各 item
オブジェクトは Movie
として型指定されます。 その他の利点として、コード エディターでコードのコンパイル時チェックと IntelliSense の完全なサポートが得られることがあります。
SQL Server Compact を使用する
Entity Framework Code First は、提供されたデータベース接続文字列がまだ存在しない Movies
データベースを指していることを検出したため、Code First はデータベースを自動的に作成しました。 App_Data フォルダーを確認することで、作成されたことを確認できます。 Movies.sdf ファイルが表示されない場合は、[ソリューション エクスプローラー] ツール バーの [すべてのファイルを表示] ボタンをクリックし、[更新] ボタンをクリックして、App_Data フォルダーを展開します。
Movies.sdf をダブルクリックして、サーバー エクスプローラーを開きます。 Tables フォルダーを展開して、データベースに作成されたテーブルを表示します。
Note
Movies.sdf をダブルクリックするとエラーが発生する場合は、SQL Server Compact 4.0 (ランタイム + ツールのサポート) がインストール済みになっていることを確認してください。 (ソフトウェアへのリンクについては、このチュートリアル シリーズのパート 1 にある前提条件の一覧を参照してください。)ここでそのリリースをインストールする場合は、Visual Web Developer を閉じて再度開く必要があります。
2 つのテーブルがあります。Movie
エンティティ セット用のものと、EdmMetadata
テーブルです。 EdmMetadata
テーブルは、モデルとデータベースが同期していないことを判断するために、Entity Framework によって使用されます。
Movies
テーブルを右クリックし、[テーブル データの表示] を選択すると、作成したデータが表示されます。
Movies
テーブルを右クリックし、[テーブル スキーマの編集] を選択します。
Movies
テーブルのスキーマが、前に作成した Movie
クラスにどのようにマップされるかに注目してください。 Entity Framework Code First では、Movie
クラスに基づいてこのスキーマが自動的に作成されます。
完了したら接続を閉じます。 (接続を閉じないと、次にプロジェクトを実行するときにエラーが発生する可能性があります)。
これで、データベースと、そこからコンテンツを表示するためのシンプルなリスティング ページが作成されました。 次のチュートリアルでは、スキャフォールディングされたコードの残りの部分を調べ、このデータベースでムービーを検索できる SearchIndex
メソッドと SearchIndex
ビューを追加します。