新しいコントローラーからモデルのデータにアクセスする
作成者 : Rick Anderson
Note
このチュートリアルの更新バージョンは、Visual Studio の最新バージョンを使用してこちらで入手できます。 新しいチュートリアルでは、mvc ASP.NET Coreを使用します。これにより、このチュートリアルに対して多くの機能強化が提供されます。
このチュートリアルでは、ASP.NET Core MVC のコントローラーとビューについて説明します。 Razor Pages は、ASP.NET Coreの新しい代替手段であり、Web UI の構築を容易かつ生産的にするページ ベースのプログラミング モデルです。 MVC バージョンの前に Razor Pages チュートリアルを試してみることをお勧めします。 この Razor ページのチュートリアルの特徴は次のとおりです。
- 使いやすい。
- 多くの機能をカバーしている。
- 新しいアプリ開発に推奨されるアプローチです。
このセクションでは、新 MoviesController
しいクラスを作成し、ムービー データを取得し、ビュー テンプレートを使用してブラウザーに表示するコードを記述します。
次の手順に進む前に、アプリケーションをビルドします。 アプリケーションをビルドしないと、コントローラーの追加中にエラーが発生します。
ソリューション エクスプローラーで Controllers フォルダーを右クリックし、[追加]、[コントローラー] の順にクリックします。
[ スキャフォールディングの追加 ] ダイアログ ボックス で、[Entity Framework を使用してビューを含む MVC 5 コントローラー] をクリックし、[ 追加] をクリックします。
Model クラス の [ムービー (MvcMovie.Models)] を選択します。
Data コンテキスト クラスの MovieDBContext (MvcMovie.Models) を選択します。
[コントローラー名] に「 MoviesController」と入力します。
次の図は、完了したダイアログを示しています。
[追加] をクリックします。 (エラーが発生した場合は、コントローラーの追加を開始する前にアプリケーションをビルドしなかった可能性があります)。Visual Studio では、次のファイルとフォルダーが作成されます。
- Controllers フォルダー内の MoviesController.cs ファイル。
- Views\Movies フォルダー。
- 新しい Views\Movies フォルダー内の Create.cshtml、Delete.cshtml、Details.cshtml、Edit.cshtml、Index.cshtml。
Visual Studio によって、 CRUD (作成、読み取り、更新、削除) アクション メソッドとビューが自動的に作成されます (CRUD アクション メソッドとビューの自動作成はスキャフォールディングと呼ばれます)。 これで、ムービー エントリを作成、一覧表示、編集、削除できる完全に機能する Web アプリケーションが作成されました。
アプリケーションを実行し、 MVC Movie リンクをクリックします (または、ブラウザーの Movies
アドレス バーの URL に /Movies を追加してコントローラーを参照します)。 アプリケーションは既定のルーティング ( App_Start\RouteConfig.cs ファイルで定義) に依存しているため、ブラウザー要求 http://localhost:xxxxx/Movies
はコントローラーの既定 Index
の Movies
アクション メソッドにルーティングされます。 言い換えると、ブラウザー要求 http://localhost:xxxxx/Movies
は実質的にブラウザー要求 http://localhost:xxxxx/Movies/Index
と同じです。 まだ追加していないため、結果は映画の空のリストになります。
ムービーの作成
[Create New](新規作成) リンクを選択します。 ムービーに関する詳細を入力し、[ 作成 ] ボタンをクリックします。
Note
[価格] フィールドに小数点またはコンマを入力できない場合があります。 小数点にコンマ (",") を使用する英語以外のロケールと、US-English以外の日付形式の jQuery 検証をサポートするには、globalize.jsと、 を使用Globalize.parseFloat
するには、特定のカルチャ/globalize.cultures.js ファイル (from https://github.com/jquery/globalize ) と JavaScript を含める必要があります。 これを行う方法については、次のチュートリアルで説明します。 ここでは、単に 10 のような整数を入力します。
[ 作成 ] ボタンをクリックすると、フォームがサーバーに投稿され、そこでムービー情報がデータベースに保存されます。 その後、 /Movies URL にリダイレクトされ、新しく作成されたムービーが一覧に表示されます。
いくつかのムービー エントリを作成します。 [編集]、[詳細]、および [削除] リンクを試してください。すべて機能します。
生成されたコードの確認
Controllers\MoviesController.cs ファイルを開き、生成されたIndex
メソッドを調べます。 メソッドを使用したムービー コントローラーの一部を Index
次に示します。
public class MoviesController : Controller
{
private MovieDBContext db = new MovieDBContext();
// GET: /Movies/
public ActionResult Index()
{
return View(db.Movies.ToList());
}
コントローラーへの Movies
要求は、テーブル内のすべてのエントリを Movies
返し、結果をビューに Index
渡します。 クラスの次の行は MoviesController
、前に説明したように、ムービー データベース コンテキストをインスタンス化します。 ムービー データベース コンテキストを使用して、ムービーのクエリ、編集、削除を行うことができます。
private MovieDBContext db = new MovieDBContext();
厳密に型指定されたモデルと @model キーワード
このチュートリアルの前半では、 オブジェクトを使用してコントローラーがビュー テンプレートにデータまたはオブジェクトを渡す方法について ViewBag
説明しました。 ViewBag
は、ビューに情報を渡す便利な遅延バインディング方法を提供する動的オブジェクトです。
MVC には、 厳密に 型指定されたオブジェクトをビュー テンプレートに渡す機能も用意されています。 この厳密に型指定されたアプローチにより、Visual Studio エディターでのコードのコンパイル時のチェックが向上し、 IntelliSense が豊富になります。 Visual Studio のスキャフォールディング メカニズムでは、メソッドとビューの作成時に、クラスとビュー テンプレートでこのアプローチ (厳密 に 型指定 MoviesController
されたモデルを渡す) を使用しました。
Controllers\MoviesController.cs ファイルで、生成されたDetails
メソッドを調べます。 メソッドを Details
次に示します。
public ActionResult Details(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Movie movie = db.Movies.Find(id);
if (movie == null)
{
return HttpNotFound();
}
return View(movie);
}
パラメーターは id
通常、ルート データとして渡されます。たとえば http://localhost:1234/movies/details/1
、コントローラーをムービー コントローラーに、アクションを に details
、を id
1 に設定します。 次のように、クエリ文字列を使用して ID を渡すこともできます。
http://localhost:1234/movies/details?id=1
Movie
が見つかった場合、モデルのMovie
インスタンスがビューにDetails
渡されます。
return View(movie);
Views\Movies\Details.cshtml ファイルの内容を確認します。
@model MvcMovie.Models.Movie
@{
ViewBag.Title = "Details";
}
<h2>Details</h2>
<div>
<h4>Movie</h4>
<hr />
<dl class="dl-horizontal">
<dt>
@Html.DisplayNameFor(model => model.Title)
</dt>
@*Markup omitted for clarity.*@
</dl>
</div>
<p>
@Html.ActionLink("Edit", "Edit", new { id = Model.ID }) |
@Html.ActionLink("Back to List", "Index")
</p>
ビュー テンプレート ファイルの先頭に ステートメントを含 @model
めることで、ビューで想定されるオブジェクトの種類を指定できます。 ムービー コントローラーを作成したとき、Visual Studio によって Details.cshtml ファイルの先頭に @model
ステートメントが自動的に追加されています。
@model MvcMovie.Models.Movie
この @model
ディレクティブにより、厳密に型指定された Model
オブジェクトを使って、コントローラーがビューに渡したムービーにアクセスできます。 たとえば、Details.cshtml テンプレートでは、コードは、厳密に型指定された Model
オブジェクトを使用して、各ムービー フィールドを DisplayNameFor
および DisplayFor HTML ヘルパーに渡します。 Create
メソッドとEdit
ビュー テンプレートもムービー モデル オブジェクトを渡します。
Index.cshtml ビュー テンプレートと MoviesController.csIndex
ファイル内の メソッドを調べます。 コードがアクション メソッドでヘルパー メソッドを List
呼び出すときにオブジェクトを View
作成する方法に Index
注目してください。 次に、この Movies
リストをアクション メソッドから Index
ビューに渡します。
public ActionResult Index()
{
return View(db.Movies.ToList());
}
ムービー コントローラーを作成すると、Visual Studio によって 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>
<th>
@Html.DisplayFor(modelItem => item.Rating)
</th>
<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 LocalDB の使用
Entity Framework Code First は、指定されたデータベース接続文字列が、まだ存在していないデータベースを Movies
指していることを検出したので、Code First によってデータベースが自動的に作成されました。 App_Data フォルダーを調べることで、作成されたことを確認できます。 Movies.mdf ファイルが表示されない場合は、ソリューション エクスプローラー ツール バーの [すべてのファイルを表示] ボタンをクリックし、[最新の情報に更新] ボタンをクリックし、App_Data フォルダーを展開します。
Movies.mdf をダブルクリックしてサーバー エクスプローラーを開き、Tables フォルダーを展開して Movies テーブルを表示します。 [ID] の横にあるキー アイコンに注意してください。 既定では、EF は ID という名前のプロパティを主キーにします。 EF と MVC の詳細については、MVC と EF に関する Tom Dykstra の優れたチュートリアルに関するページを参照してください。
テーブルを右クリックし、[テーブル データのMovies
表示] を選択して、作成したデータを表示します。
テーブルを Movies
右クリックし、[ テーブル定義を開く ] を選択して、Entity Framework Code が最初に作成したテーブル構造を表示します。
テーブルのスキーマが、前に Movies
作成した Movie
クラスにどのようにマップされるかに注目してください。 Entity Framework Code First では、クラスに基づいてこのスキーマが自動的に Movie
作成されます。
完了したら、 MovieDBContext を右クリックして [接続を閉じる] を選択して 、接続を閉じます。 (接続を閉じていない場合は、次にプロジェクトを実行するときにエラーが発生する可能性があります)。
これで、データを表示、編集、更新および削除できるデータベースができました。 次のチュートリアルでは、スキャフォールディングされたコードの残りの部分を調べ、このデータベースでムービーをSearchIndex
検索できるメソッドとビューを追加SearchIndex
します。 MVC で Entity Framework を使用する方法の詳細については、「 ASP.NET MVC アプリケーションの Entity Framework データ モデルの作成」を参照してください。
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示