血糖値管理をWebアプリにする③ 理解のまとめ2

プログラミング

血糖値管理プログラムを、Web版にするにあたり、Razor Pages モデルで開発します。

今回は Razor Pages モデル について、理解したことを記載します。
Razor Pages モデル は、ビューを担当する Razorページ と リクエストの受付処理 や ロジック関係の処理を担当する PageModelクラス がメインの役者です。

まず、Razorページ と PageModelクラス について記載します。

つづいて、Razorページ と PageModelクラス は、 プロジェクトフォルダの下のPagesフォルダ内に作られるのですが、このファイルとブラウザから指定するURLとの関係を記します。

最後に Razor Pagesモデル の Program.csファイル の内容について記載します。

なお、バインドという機能も重要なのですが、これについては別途掲載したいと思います。

百聞は一見に如かず です。
まずは、Razor ページ について見ていきます。
Razor ページ は、拡張子”.cshtml”がついたファイルです。
サンプルとして index.cshtml という Razor ページ の中味を見てみましょう。
一見するとHTMLファイルのようですが、このファイルに タグヘルパー というものを埋め込んでいます。

赤の部分がタグヘルパーです。

@page
@model RazorPagesContacts.Pages.Customers.IndexModel
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
 
<h1>Contacts home page</h1>
<form method=”post”>
    <table class=”table”>
        <thead>
            <tr>
                <th>ID</th>
                <th>Name</th>
                <th></th>
            </tr>
        </thead>
        <tbody>
        @if (Model.Customers != null)
        {
            foreach (var contact in Model.Customers)
            {
                <tr>
                    <td> @contact.Id </td>
                    <td>@contact.Name</td>
                    <td>
                        <!– <snippet_Edit> –>
                        <a asp-page=”./Edit” asp-route-id=”@contact.Id“>Edit</a> |
                        <!– </snippet_Edit> –>
                        <!– <snippet_Delete> –>
                        <button type=”submit” asp-page-handler=”delete” asp-route-id=”@contact.Id“>delete</button>
                        <!– </snippet_Delete> –>
                    </td>
                </tr>
            }
        }
        </tbody>
    </table>
    <a asp-page=”Create”>Create New</a>
</form>

index.cshtmlファイル をサーバーが解析をして、埋め込まれている タグヘルパー に対応する C# の コード を実行します。
C# の コード を実行することで、タグヘルパー を情報源にして HTML 要素を作成 し、レンダリング をします。
つまり、ブラウザに表示するHTMLを作成します。

タグヘルパー は、@ 識別子 で始まるものや、タグ要素の 属性 として指定します。

主な タグヘルパー には次のようなものがあります。

@ 識別子タグ要素の属性
@model
@page
@section
@inject
@using
@for
@foreach
@if
@else
@switch  
asp-for: モデル式にバインドする属性です。<input> や <label> などの要素で使用できます。
asp-action: アクションメソッドにバインドする属性です。<a> や <form> などの要素で使用できます。
asp-controller: コントローラー名にバインドする属性です。<a> や <form> などの要素で使用できます。
asp-route: ルート値にバインドする属性です。<a> や <form> などの要素で使用できます。
asp-append-version: 静的ファイルのバージョン番号を追加する属性です。<img> や <link> などの要素で使用できます。
asp-area: エリア名にバインドする属性です。<a> や <form> などの要素で使用できます。
asp-validation-for: モデル式に対する検証メッセージを表示する属性です。<span> 要素で使用できます。
asp-validation-summary: モデル全体に対する検証メッセージを表示する属性です。<div> 要素で使用できます。
asp-items: 選択肢を提供するコレクションにバインドする属性です。<select> 要素で使用できます。
asp-antiforgery: アンチフォージェリートークンを生成する属性です。<form> 要素で使用できます

なお、上記サンプルにある @contact.Id や @contact.Name は、変数を参照するための タグヘルパーです。

タグヘルパー についての詳細ココを参照してください。
ASP.NET Core の組み込みタグ ヘルパー | Microsoft Learn



次に PageModelクラス について見ていきましょう。

Razor Pages では、PageModelクラス は、“.cs” という拡張子を持つファイルで、 Razorページの “.cshtml” ファイルに対応する ページのロジック を記述するファイルです。

PageModelクラス には、例えば、HTTP GET 要求がページに対して行われたときに呼び出される OnGet メソッドや、データの登録処理などを記述することができます。

PageModelクラス を使用して ロジック と ビュー を分離して記述することができます。

PageModelクラス 名は、例えば、Index.cshtml に対応する PageModelクラス は、Index. cshtml.cs という名前になります。

以下に、PageModelクラス の例を示します。

using Microsoft.AspNetCore.Mvc.RazorPages;
 
namespace RazorPagesSample.Pages
{
    public class IndexModel : PageModel
    {
        public string Message { get; set; }
 
        public void OnGet()
        {
            Message = “Hello world!”;
        }
    }
}

上記例はブラウザからの Getリクエスト の処理を OnGet メソッド で行っています。
そして、”Hello world!” を Razorページ の Index.cshtml に返しています。
ちなみに、Index.cshtml は次のようになります

@page
@model RazorPagesSample.Pages.IndexModel
 
<!DOCTYPE html>
<html>
<head>
    <title>Index</title>
</head>
<body>
    <h1>@Model.Message</h1>
</body>
</html>

Razor Pagesモデル では、Razorページ と PageModelクラス が協力し合って、ビュー処理 と ロジック処理 をそれぞれが担っています。

Razorページ拡張子“.cshtml”
ビューの部分を担当。※
※PageModelクラスを使うことで、ビューとモデルの分離ができます。 タグヘルパーを埋め込み、サーバー側のC#コードを使用して、HTMLの作成やレンダリングを行う。
PageModelクラス拡張子“.cshtml.cs”
Razorページのモデル部分を担当。 PostリクエストやGetリクエストのコード処理を行い、結果をビューであるRazorページに返したり、データの登録処理などを行う。

次に、Razorページ の ファイル名 と パス と URL の関係についてです。
次のような関係になっています。

ファイル名とパス一致 URL
/Pages/Index.cshtml/ または /Index
/Pages/Contact.cshtml/Contact
/Pages/Store/Contact.cshtml/Store/Contact
/Pages/Store/Index.cshtml/Store または /Store/Index

最後に Razor Pageモデル のプロジェクトを作成したときに Program.cs ファイルに記述されるコードについて確認しておきます。

Razor Pageモデル の プロジェクト には、赤字の部分 のコードが付加されます。

builder.Services.AddRazorPages();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler(“/Error”);
    app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();

以上、Razor Pages の Razorページ、PageModelクラス、Razorページのファイル名とパスとURLの関係、Program.csの内容の確認でした。

追記
理解をしながらチュートリアルを行っています。
なかなか理解できず、歩みは、ゆっくりです。
8月9日から12日の4連休でチュートリアルの「作成、読み取り、更新、および削除」まで一応、終了しました。
一応というのも、「過剰ポスティング」対策など理解できない概念が、まだあるからです。
次の4連休は、8月30日から9月2日を予定しています。
その頃は、まだまだ、暑い時期でしょうから、冷房の効いた部屋で、チュートリアルにいそしみたいと思っています。
とにかく、私は、からっきし暑さに弱いので、庭仕事はもう少しお休みです。

タイトルとURLをコピーしました