Share via


新しいコントローラーからモデルのデータにアクセスする

作成者 : 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 フォルダーを右クリックし、[追加]、[コントローラー] の順にクリックします。

[ソリューション エクスプローラー] ウィンドウを示すスクリーンショット。Controllers フォルダーの右クリック メニューが開き、[追加] が選択されています。サブメニューでコントローラーが選択されています。

[ スキャフォールディングの追加 ] ダイアログ ボックス で、[Entity Framework を使用してビューを含む MVC 5 コントローラー] をクリックし、[ 追加] をクリックします。

[スキャフォールディングの追加] ダイアログを示すスクリーンショット。Entity Framework を使用するビューを含む M V C 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.cshtmlIndex.cshtml

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

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

空のインデックス リストを含む M V C ムービー ページを示すスクリーンショット。

ムービーの作成

[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 の完全なサポートが得られます。

ModelIntelliSense

SQL Server LocalDB の使用

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

[ソリューション エクスプローラー] ウィンドウを示すスクリーンショット。App Data フォルダーと Movies ドット m d f サブフォルダーは赤で囲まれています。

Movies.mdf をダブルクリックしてサーバー エクスプローラーを開き、Tables フォルダーを展開して Movies テーブルを表示します。 [ID] の横にあるキー アイコンに注意してください。 既定では、EF は ID という名前のプロパティを主キーにします。 EF と MVC の詳細については、MVC と EF に関する Tom Dykstra の優れたチュートリアルに関するページを参照してください。

DB_explorer

テーブルを右クリックし、[テーブル データMovies表示] を選択して、作成したデータを表示します。

[サーバー エクスプローラー] ウィンドウを示すスクリーンショット。[ムービー] 右クリック メニューが開いています。[テーブル データの表示] が選択され、赤で囲まれています。

M V C Movie Microsoft Visual Studio ウィンドウを示すスクリーンショット。[d b o dot Movies Data]\(ムービー データ\) タブが選択されています。

テーブルを Movies 右クリックし、[ テーブル定義を開く ] を選択して、Entity Framework Code が最初に作成したテーブル構造を表示します。

[サーバー エクスプローラー] ウィンドウを示すスクリーンショット。[ムービー] 右クリック メニューが開いています。[テーブル定義を開く] が選択され、赤で囲まれています。

M V C Movie Microsoft Visual Studio ウィンドウを示すスクリーンショット。[d b o dot Movies Design]\(ムービーのデザイン\) タブが選択されています。

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

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

[サーバー エクスプローラー] ウィンドウを示すスクリーンショット。Movie D B コンテキストの右クリック メニューが開いています。[接続を閉じる] が選択され、赤で囲まれます。

これで、データを表示、編集、更新および削除できるデータベースができました。 次のチュートリアルでは、スキャフォールディングされたコードの残りの部分を調べ、このデータベースでムービーをSearchIndex検索できるメソッドとビューを追加SearchIndexします。 MVC で Entity Framework を使用する方法の詳細については、「 ASP.NET MVC アプリケーションの Entity Framework データ モデルの作成」を参照してください。