なんとかするから、なんとかなる

エンジニア関係のことを書きます

初めてのASP.NET MVC

初めてASP.NET MVCを触ってみたときの入門的な内容

ASP.NET MVCを勉強したときのメモ

View

  • .CSHTMLに書かれておりC#記法とHTML記法の共生が可能
  • Razor構文を利用する
  • C#記法で記述する場合は、C#部分前に@をつける
foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.AlertTiming)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.UpdateAt)
            </td>
            <td>
                <a asp-action="Edit" asp-route-id="@item.id">Edit</a> |
                <a asp-action="Details" asp-route-id="@item.id">Details</a> |
                <a asp-action="Delete" asp-route-id="@item.id">Delete</a>
            </td>
        </tr>
}

HTMLタグとCheckBoxForなどについて

  • HTMLタグではHTMLと同様の動きができる。ただし、@を使うことでC#のプロパティも使える
  • CheckBoxForなどRazor記法を使うと、DataBindingされた状態のCheckboxが作れるようだ。

Controllerとの連携 

Controllerとデータ連携をする方法は3パタ-ン

  1. @modelで View生成時に引数で渡す
  2. ViewDataを利用する
  3. ViewBagを利用する

Viewに必要なデータを渡す時は@modelで渡し、Viewから値を受け取る必要がある時はViewBagを利用するのが良さそう。

@modelでView生成時に引数で渡す

cshtml @model 引数の方を指定する。 dynamicでも指定できるが、コンパイル時にチェックできるように型を指定する方が良い

@model IEnumerable<CostManagementWebApp.Models.BudgetInfo>

cshtml内ではModelとして値にアクセスが可能。 大文字始まりなのは、内部でプロパティを設定しているからだと推測。

Controller側ではView生成時に必要な値を渡す。

View(await _context.BudgetInfos.ToListAsync());

ViewDataを利用する

KVCでViewDataに対して値を渡すことができる。 ViewDataはControllerとView双方向でデータのやりとりが可能。 Dynamic型のDictionaryなので、なんでも渡せるが型情報が消えるのが難点

ViewData["Title"] = "Index"

ViewBagを利用する

ViewDataと似ているがKeyではなく、プロパティとして直接渡せる(コンパイル時にタイポを検出可能) ViewDataはControllerとView双方向でデータのやりとりが可能。 Dynamic型のDictionaryなので、なんでも渡せるが型情報が消えるのが難点

ViewBag.title = "Index"

ViewとModelとViewModel

VisualStudioのテンプレートでは、ViewとModelがつながっている [Model] - [View]

ModelのデータをそのままViewで表示する場合は問題ないが、Viewで表示する際に表示用にデータを整形する必要がある場合、ViewModelを利用する

[Model] - [ViewModel] - [View]

それぞれ参照する方法は、ControllerでViewを生成する時に、Model情報をViewModelにMap,@modelを渡す時にViewModelを渡す。

クラス実装について

メンバ変数

public int SomeValue {Set; Get;} = 0

ControllerとViewの連携について

[Http Post], [Http Get]

  • [Http Post], [Http Get]をつけることで、各自POSTもしくはGETでしか呼ばれないようにフィルタリングされる
  • formタグを使用した場合、デフォルトがPOST

Formタグの使用方法

HTMLタグヘルパー

  • Html.BeginForm

タグヘルパー

  • asp-actionでControllerで呼ばれるメソッドを指定 asp-route-*でパラメータを渡す。( * は任意のパラメータプロパティ)

    formタグ内でinputタグを使用することでユーザからの入力を取得する