ASP.NET Razor Pages を最初から(3)
はじめに
RazorPagesの1ページを構成している要素は、.cshtmlというビューファイルと、.cshtml.csというPageModelクラスが定義されているファイルだと確認ができた。
ここでは、PageModelの値をビューファイル(*.cshtml)に渡す仕組みである@modelディレクティブを簡単に触ってみる。
@modelディレクティブとは何か
@page
@model PageModel
Index.cshtmlファイルの@modelディレクティブで指定されているIndexModelは何なのかという話。
@model部分をコメントアウトしても普通にコンパイルできたので、必須というわけではないようだ。
VisualStudio2022の「定義をここに表示」で@model IndexModel
の定義を表示してみると。
Index.cshtml.cs
のIndexMode
クラスが表示される。
@model IndexModelとする事で、@ModelでIndexModelのインスタンスにアクセスできる(という事だと思う)
IndexModelにプロパティを追加してアクセスする
public class IndexModel : PageModel
{
private readonly ILogger<IndexModel> _logger;
public string Value { get; set; } // プロパティ追加
public IndexModel(ILogger<IndexModel> logger)
{
_logger = logger;
}
public void OnGet()
{
Value = "Sample Value"; // 初期化
}
}
@page
@model IndexModel
@{
ViewData["Title"] = "Home page";
}
<div class="text-center">
<h1 class="display-4">Welcome</h1>
<p>@Model.Value</p> @*ここに追加*@
<p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>
Sample Valueが表示された。
@ModelでIndexModelのインスタンスにアクセスできる事が確認できた。
View(*.cshtml)で使用したい値は、*Modelクラス側でプロパティに設定する事で利用できるようだ。
ASP.NET MVCの時の@model
ASP.NET MVCの時にも*.cshtmlに@modelを記述していたが、その際には
ControllerからViewに渡す値の型を書いていたと思う。
// Modelsフォルダでデータ型を定義
class SampleModel
{
public string Name{get;set;}
}
// ControllerのメソッドでSampleModelを使用する
public ActionResult Index()
{
var m = new SampleModel{Name="Test Name"};
return View(m);
}
// Viewで@modelにSampleModelを指定
@model SampleModel.Models.SampleModel;
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<p>@Model.Name</p>
</body>
</html>
おそらく、RazorPageのOnGetは戻り値がvoidになっているが、暗黙的に
自分のインスタンスをリターンしているのだろう、という理解にしておく。
.cshtml.csから.cshtmlへのデータの渡し方はわかったので
次回は新規ページの作成と共通レイアウトについて調べてみようと思う。
Discussion