情報応用演習Ⅰ(2024)

【T9a】簡易ブログソフトウェアの作成 Part.Ⅰ ~ 認証機能の組み込み(11/14)

プロジェクトタイプASP.NET Core Web アプリ(Model-View-Controller)
プロジェクト名T9a
ソリューション名PIT9
ターゲットフレームワーク.NET 8.0(長期的なサポート)
最上位レベルのステートメントを使用しない使用する(チェックオフ)
注意
  • 本ページの作業内容は 前のページまでの続き になっていることに注意せよ.
    • 先に前のページまでをすべて読み,指示されている作業を済ませてから本ページを読むこと.
    • プロジェクトの作成作業については準備作業を参照せよ.

9a-11. モデルクラスに対するカスタム検証ロジックの実装

前節までにAccountsコントローラーにユーザーの追加(≒新規登録)機能を実装したが,実は現段階では「パスワード(確認)」の欄は全く機能していない

試しに「パスワード(確認)」に「パスワード」の欄とは異なる値を入力してユーザーを作成してみよう(空にはできないので注意). ユーザー名やパスワードが適切なものであれば,二つの入力欄の入力値が食い違っていてもユーザーの作成が成功してしまうはずである(_).

実行結果

この欄の入力内容は全くチェックしていないため,「パスワード(確認)」の入力欄はお飾りとなってしまっている. このチェックをアクションメソッドで行ってもよいが, モデルクラスにこのチェックを埋め込むことが可能である . 今回はこの方法でチェックを実装してみよう. Models/NewUserInfo.cs を_に示すように変更しよう.

NewUserInfoクラスの追記内容
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 新規ユーザー登録のためのモデルクラス
public class NewUserInfo : IValidatableObject
{
    [Display(Name = "ユーザー名")]
    public string Username { get; set; } = "";

    [Display(Name = "ニックネーム")]
    public string? Nickname { get; set; }

    [Display(Name = "メールアドレス")]
    [EmailAddress]
    public string Email { get; set; } = "";

    [Display(Name = "パスワード")]
    [DataType(DataType.Password)]
    public string Password { get; set; } = "";

    [Display(Name = "パスワード(確認)")]
    [DataType(DataType.Password)]
    public string PasswordConfirmation { get; set; } = "";

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (Password != PasswordConfirmation)
            yield return new ValidationResult("入力されたパスワードが一致しません.");
    }
}

モデルクラスにIValidatableObjectインターフェースを 実装している.このインターフェースのインターフェースメソッドValidate()メソッドを実装することで,モデルクラスの値の検証ロジックを カスタマイズすることができる.ここではPasswordプロパティ(「パスワード」)とPasswordConfirmationプロパティ(「パスワード(確認)」)の値が 一致していることを検証しており,そうでなければyield return(いーるど・りたーん)を 使ってエラーを報告している.yield returnIEnumerable<T>を返すメソッドやプロパティで使用できるC#の構文の一つであるが詳細は省略する. 詳しい内容を知りたい者はyield contextual keyword - C# Reference - Microsoft Docsなどを読むとよい. ちなみにIValidatableObjectを使った入力値の検証は,データアノテーションを用いたチェックと異なりサーバー側で行われる.

ここまで書けたら実行してみよう.プロジェクトを起動して「ログイン」のリンクをクリックしadminとして ログインしよう.プロジェクト起動時にログイン済みの場合は画面上部の「ユーザー一覧」のリンクをクリックすると ユーザー一覧の画面(Index)が表示される.「新規ユーザー登録」のリンクをクリックして,ユーザーの新規登録画面(AddUser)を表示させる. 先ほどと同じように「パスワード」と「パスワード(確認)」に食い違った値を入力して,ユーザーの作成を試みてみよう(_). 先ほどとは異なり,今回はユーザーの作成がエラーとなるはずである(_). このエラーメッセージは,<div asp-validation-summary="All"></div>のエラーメッセージのリストの一部として表示される.

実行結果
Last updated on 2024-06-19
Published on 2024-06-19

Powered by Hugo. Theme by TechDoc. Designed by Thingsym.