Grow up

生活とプログラミング

.Net Core MVC を使った初めてのWebアプリ開発 #3

f:id:knkomko:20190912123325p:plain:w450

はじめに

#2 ではコントローラーとルーティングついてまとめました。
knkomko.hatenablog.com

#3 はビューについて解説していきます。
ソースコードASP.NET Core MVC の概要 | Microsoft Docsを参考にしています。

1. ビューの追加

Viewフォルダを右クリックして[追加]から[新しいフォルダー]を左クリックします。
フォルダーの名前は「HelloWorld」で作成します。
f:id:knkomko:20190912212735p:plain:w350

Viewフォルダ内に作成した[HelloWorld]フォルダを右クリックして[追加]から[新しい項目]を左クリックします。
f:id:knkomko:20190912212837p:plain:w350

[Razor ビュー]を選択して「Index.cshtml」の名前で[追加]を左クリックします。
f:id:knkomko:20190912213415p:plain:w350

Index.cshtmlの内容を次のコードに置き換えます。

@{
    ViewData["Title"] = "Index";
}

<h2>Index</h2>

<p>Hello from our View Template!</p>

f:id:knkomko:20190912213655p:plain:w350

次に HelloWorldController の Index メソッドを次にコードに書き換えます。
View() の戻り値では IActionResult を返します。

        public IActionResult Index()
        {
            return View();
        }

f:id:knkomko:20190924123438p:plain:w350

以下のURLにアクセスするとRazor ビューの Index.cshtml が表示できます。
https://localhost:44370/HelloWorld/

2. レイアウトの変更

複数のWebページに共通した要素はレイアウトファイルに記述します。
レイアウトファイルを使用すると修正による変更箇所を最小限に抑えられます。
f:id:knkomko:20190929075453p:plain:w350

Views/Shared/_Layout.cshtml を開いてレイアウトファイルの内容を変更します。

①タイトル要素とフッター要素で、MvcMovie を Movie App に変更します。
変更前
f:id:knkomko:20190929075513p:plain:w350

変更後
f:id:knkomko:20190929075529p:plain:w350

②アンカー要素を変更します。
変更前
f:id:knkomko:20190929075545p:plain:w350

変更後
f:id:knkomko:20190929075920p:plain:w350

Views/HelloWorld/Index.cshtml を開きます。
f:id:knkomko:20190929082832p:plain:w350

タイトルと表示文章の違いが分かりやすくなるように表示内容を変更します。
タイトルとh2要素の内容を変更します。
f:id:knkomko:20190929084428p:plain:w350

ポート番号は実行時の番号に変更をして頂き以下のURLにアクセスします。
https://localhost:44370/HelloWorld/

URLにアクセスすると以下のようなWebページが表示されます。
f:id:knkomko:20190924124510p:plain:w350

赤下線が Index.cshtml で変更した内容です。
青下線が _Layout.cshtml で変更した内容になります。
f:id:knkomko:20190929084442p:plain:w350

Views/Shared/_Layout.cshtml はViews/_ViewStart.cshtml によって各ビューに共通要素を表示します。
Layout プロパティを変更することで別のレイアウトの指定や、null を設定することでレイアウトを使用しないようにできます。
f:id:knkomko:20190929090844p:plain:w350

3. コントローラーからビューへデータの受け渡し

#2 ではコントローラーだけを使用してURLに入力したパラメータ情報を表示させていました。
f:id:knkomko:20190911234944p:plain:w450


今回はURLで入力したパラメータ情報をビューに渡して表示します。
Controllers/HelloWorldController.cs のIndexアクションメソッドを変更します。
f:id:knkomko:20190929092406p:plain:w350

ビューへデータを渡すには ViewData オブジェクトを使用します。
"Message"や"NumTimes"はViewDataの変数になります。
f:id:knkomko:20190929092425p:plain:w350

ビューでは"Message"と"NumTimes"の変数をViewDataに指定することでコントローラーで割り当てられたデータを受け取ることができます。
Views/HelloWorld/Welcome.cshtml でコントローラーから渡された値を表示するようにします。

Welcomeビューを作成します。
Viewsフォルダを右クリック → [追加] → [新しい項目] の順で左クリック。
f:id:knkomko:20190929102338p:plain:w350

[Razor ビュー]を選択して名前を「Welcome.cshtml」として[追加]を左クリック。
f:id:knkomko:20190929102508p:plain:w350

Welcome.cshml の内容を以下のコードに置き換えます。
(int)ViewData["NumTimes"]と@ViewData["Message"]にはコントローラーから渡された値が割り当てられます。
@で始まるコードはHTMLヘルパーと呼ばれています。
HTMLヘルパーを使うとhtmlの作成にC#のオブジェクトやfor文などの処理を使うことができます。

@{
    ViewData["Title"] = "Welcome";
}

<h2>Welcome</h2>

<ul>
    @for (int i = 0; i < (int)ViewData["NumTimes"]; i++)
    {
        <li>@ViewData["Message"]</li>
    }
</ul>

f:id:knkomko:20190929102702p:plain:w350

以下のURLにアクセスします。
https://localhost:44370/HelloWorld/Welcome?name=Makoto&numtimes=4

URLで「name」に指定している文字列が「numtimes」で指定した数だけ表示されます。
f:id:knkomko:20190929102926p:plain:w350

URLにアクセスした時の動作は図のような動作です。
①URLから指定したnameとnumTimesのパラメータをWelcome(name, numTimes)の引数として渡します。
②Welcomeメソッドは引数で渡されたnameとnumTimesの値をViewData["Message"]とViewData["NumTimes"]に格納します。
③ビューは渡されたViewDataの値をHTMLヘルパーを使って作成するhtmlに埋め込みます。
④最後にコントローラがビューで作成されたhtmlをブラウザに返して一連の処理が終了します。
f:id:knkomko:20190930221044p:plain:w550

まとめ

#3ではコントローラーからビューを呼び出しました。
#4ではモデルを使います。