初めてのASP.NET MVC
初めてASP.NET MVCを触ってみたときの入門的な内容
ASP.NET MVCを勉強したときのメモ
View
@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パタ-ン
- @modelで View生成時に引数で渡す
- ViewDataを利用する
- 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を渡す。
クラス実装について
メンバ変数
- 宣言と同時にイニシャライズはできない
- コンストラクタもしくは必要時に初期化する(違います) http://ufcpp.net/study/csharp/ap_ver6.html
- 次のようにしてメンバ変数宣言時に初期化可能
public int SomeValue {Set; Get;} = 0
ControllerとViewの連携について
[Http Post], [Http Get]
- [Http Post], [Http Get]をつけることで、各自POSTもしくはGETでしか呼ばれないようにフィルタリングされる
- formタグを使用した場合、デフォルトがPOST
Formタグの使用方法
HTMLタグヘルパー
- Html.BeginForm