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!;
}