Razor Pagesのフォームの入力検証のValidationAttributeクラスでページモデルクラスのオブジェクトを取得する

Razor Pagesのフォームの入力内容の検証で、ページモデルクラスのオブジェクトを取得するコードを紹介します。

概要

こちらの記事ではRazor Pagesの入力内容の検証を実装しました。 この記事では、検証の処理時にページモデルクラスのオブジェクトを取得し、ページモデルクラスのメソッドを呼び出して検証するプログラムのコードを紹介します。

こちらの記事で紹介した方法は、ValidationAttribute クラスを継承したクラスを定義し、 IsValidメソッドを実装して検証しました。
単純な検証ではこの方法で問題ありませんが、複雑な検証の場合、ページモデルクラスの情報を参照する場合があり、ページモデルクラスのメンバ変数や メソッドを呼び出したい場合があります。

ValidationAttribute クラスを継承したクラスから、ページモデルクラスを取得する場合には、IsValid メソッドの パラメーターの ValidationContext オブジェクトのObjectInstance でページモデルクラスのオブジェクトを参照できます。

プログラム例

以下のRazorPagesを作成します。

コード

Pages/CustomValidation03.cshtml
@page
@model RazorPagesValidation.Pages.CustomValidation03Model
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

@{
}
<html>
<head>
</head>
<body>
  <h2>入力内容のカスタム検証のデモ</h2>
  <form method="post">
    <input type="text" asp-for="inputText" />
    <text>@Model.ErrorMessageText1</text><br />
    <input type="submit" value="Exec" />
  </form>

  <p>@Model.MessageText</p>
</body>
</html>

Pages/CustomValidation03.cshtml.cs
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.Mvc.RazorPages;
using System.ComponentModel.DataAnnotations;

namespace RazorPagesValidation.Pages
{

  public class InputTextValidationAttribute : ValidationAttribute
  {
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
      CustomValidation03Model model = (CustomValidation03Model)validationContext.ObjectInstance;
      string svalue = (string)value;

      if (model.CheckValue(svalue) == true) {
        return ValidationResult.Success;
      }
      else {
        return new ValidationResult("duckを含む10文字以下の文字列が必要です。");
      }
    }
  }


  public class CustomValidation03Model : PageModel
  {
    [BindProperty]
    [InputTextValidationAttribute]
    public string inputText { get; set; } = "";

    public string MessageText { get; set; } = "";
    public string ErrorMessageText1 { get; set; } = "";

    public void OnGet()
    {
    }

    public PageResult OnPost()
    {
      if (ModelState.IsValid == true) {
        MessageText = "処理は成功しました。";
      }
      else {
        ErrorMessageText1 = "";
        if (ViewData.ModelState["inputText"] != null) {
          ModelStateEntry mse = ViewData.ModelState["inputText"]!;
          foreach (ModelError me in mse.Errors) {
            ErrorMessageText1 += me.ErrorMessage;
          }
        }
      }

      return Page();
    }

    public bool CheckValue(string CheckValue)
    {

      if (CheckValue != null && CheckValue.IndexOf("duck") >= 0 && CheckValue.Length < 10) {
        return true;
      }
      else {
        return false;
      }
    }

  }
}

解説

検証のコードはこちらの記事を参照してください。

InputTextValidationAttribute クラスのIsValid での検証の際に、ページモデルクラスのメソッドを呼び出します。
validationContext.ObjectInstance がページモデルクラスのオブジェクトの参照になります。ページモデルクラスでキャストして、model 変数に代入しています。
以後は、model変数でページモデルクラスのメソッドやメンバ変数の参照が可能です。
以下のコードでは、ページモデルクラスに実装されている、CheckValue() メソッドを呼び出し値の検証をしています。

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
      CustomValidation03Model model = (CustomValidation03Model)validationContext.ObjectInstance;
      string svalue = (string)value;

      if (model.CheckValue(svalue) == true) {
        return ValidationResult.Success;
      }
      else {
        return new ValidationResult("duckを含む10文字以下の文字列が必要です。");
      }
    }

実行結果

プロジェクトを実行し、ページを表示します。下図のページが表示されます。
Razor Pagesのフォームの入力検証のValidationAttributeクラスでページモデルクラスのオブジェクトを取得する:画像1

テキストボックスに"Penguin"を入力し、[Exec]ボタンをクリックします。
下図の画面が表示されます。duckを含んでいないため、"duckを含む10文字以下の文字列が必要です。"のメッセージが表示されます。
Razor Pagesのフォームの入力検証のValidationAttributeクラスでページモデルクラスのオブジェクトを取得する:画像2

続いてテキストボックスに "30duck40"を入力し、[Exec]ボタンをクリックします。
duckを含んでおり、10文字以下の文字列のため、"処理は成功しました"のメッセージが表示されます。
Razor Pagesのフォームの入力検証のValidationAttributeクラスでページモデルクラスのオブジェクトを取得する:画像3

"30duck40506070" を入力して、[Exec]ボタンをクリックした場合は、入力文字列が10文字以上となるため、 "duckを含む10文字以下の文字列が必要です。"のメッセージが表示されます。
Razor Pagesのフォームの入力検証のValidationAttributeクラスでページモデルクラスのオブジェクトを取得する:画像4

入力検証の際に、ページモデルクラスのオブジェクトを取得して検証するコードを紹介しました。


AuthorPortraitAlt
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
作成日: 2024-11-12
Copyright © 1995–2025 iPentec all rights reserverd.