Razor Pagesのフォームの入力内容の検証で、ページモデルクラスのオブジェクトを取得するコードを紹介します。
こちらの記事ではRazor Pagesの入力内容の検証を実装しました。
この記事では、検証の処理時にページモデルクラスのオブジェクトを取得し、ページモデルクラスのメソッドを呼び出して検証するプログラムのコードを紹介します。
こちらの記事で紹介した方法は、ValidationAttribute
クラスを継承したクラスを定義し、
IsValid
メソッドを実装して検証しました。
単純な検証ではこの方法で問題ありませんが、複雑な検証の場合、ページモデルクラスの情報を参照する場合があり、ページモデルクラスのメンバ変数や
メソッドを呼び出したい場合があります。
ValidationAttribute
クラスを継承したクラスから、ページモデルクラスを取得する場合には、IsValid
メソッドの
パラメーターの ValidationContext
オブジェクトのObjectInstance
でページモデルクラスのオブジェクトを参照できます。
以下のRazorPagesを作成します。
@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>
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文字以下の文字列が必要です。");
}
}
プロジェクトを実行し、ページを表示します。下図のページが表示されます。
テキストボックスに"Penguin"を入力し、[Exec]ボタンをクリックします。
下図の画面が表示されます。duckを含んでいないため、"duckを含む10文字以下の文字列が必要です。"のメッセージが表示されます。
続いてテキストボックスに "30duck40"を入力し、[Exec]ボタンをクリックします。
duckを含んでおり、10文字以下の文字列のため、"処理は成功しました"のメッセージが表示されます。
"30duck40506070" を入力して、[Exec]ボタンをクリックした場合は、入力文字列が10文字以上となるため、
"duckを含む10文字以下の文字列が必要です。"のメッセージが表示されます。
入力検証の際に、ページモデルクラスのオブジェクトを取得して検証するコードを紹介しました。