ASP.NET Core MVCでの入力値検証対象外設定

ASP.NET Core MVCでは、入力先となる、クラスに検証用の属性を付けることで、入力フォームの検証を簡単に行う事が可能である。

ただ、@modelで指定したModel全てが検証対象となるため、ここにI/F用のエラーメッセージなどのプロパティを入れると、何も指定しない限り、検証エラーとなってしまうようだ。

例)

public class AddModel {
    public Person Person { get; set; } = null!;
    public string Message { get; set; } = null!;
}

public class Person {
    [Key]
    [Required(ErrorMessage ="社員番号は必須です。")]
    public string EmpNo { get; set; } = null!;
    [Required(ErrorMessage ="氏名は必須です。")]
    public string Name { get; set; } = null!;
    [Required(ErrorMessage ="メールアドレスは必須です。")]
    [EmailAddress]
    public string Mail { get; set; } = null!;
    public DateTime Birthday { get; set; }
}
@model AddModel

<span>@Model.Message</span>

社員番号:<input for="Person.EmpNo"/> @Html.ValidationMessage("Person.EmpNo")<br/>
氏名:<input for="Person.Name"/> @Html.ValidationMessage("Person.EmpNo")<br/>
・・・
<button asp-action="AddRecord">追加</button>
・・・
public IActionResult AddRecord(AddModel model) {

    if (!ModelState.IsValid) {	// Messageのせいで常にfalseとなってしまう・・・
        model.Message = "不正な入力があります";
        return View("Add",model);
    }
	・・・
	var cnt = ctx.Personel.Where(v=>v.EmpNo == model.Person.EmpNo).Count();
	if (cnt != 0) {
        model.Message = $"社員番号'{model.Person.EmpNo}'は既に登録されています";
        return View("Add",model);
	}
	・・・
}

いろいろ、試してみたが、中々、解決できなかった。検証用の属性を調べた結果、ValidateNever属性を付けると、検証対象外となるようなので、試したらうまく動いたよ。

using Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
・・・
public class AddModel {
    public Person Person { get; set; } = null!;
    [ValidateNever]
    public string Message { get; set; } = null!;
}

takezou について

ソフトウェア開発会社(ITと言う言葉は大嫌い)で働く、元技術者。 未だに、社内システム位は作ってますが・・・ プログラミング言語はC#が好き。
カテゴリー: .NET, asp.net core, C#, 技術系 パーマリンク

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください