目次
ユーザーの入力に間違いがないか検証する方法についてのメモ。
Validatorクラスについて
このクラスには下記の3×2個のメソッドがありますが、ValidateObjectが一番使い勝手が良いです。
- ValidateObject
- ValidateProperty
- ValidateValue
- TryValidateObject
- TryValidateProperty
- TryValidateValue
DataAnnotationsの属性でルール作成
まず、検証したいプロパティに下記のように属性を付与します
public class UseCase
{
[MaxLength(50)]
public string Name {get; set;}
[EmailAddress]
public int Email {get; set;}
[Phone]
public int Phone {get; set;}
}
ValidateObjectメソッドで検証
検証ルールを記述したら、Validatorに検証の判定をさせます。1つでも検証がNGだとValidationExceptionがスローされます。
public void Validation(UseCase useCase)
{
var errors = new List<ValidationResult>();
Validator.ValidateObject(useCase, new ValidationContext(useCase));
}
上記だと複数のルール違反があっても1つしか検証結果が返ってこないので、すべての検証結果が欲しい場合は、下記のように私は記述しています。
public void Validation(UseCase useCase)
{
var errors = new List<ValidationResult>();
if(!Validator.TryValidateObject(useCase, new ValidationContext(useCase), errors))
{
throw new ValidationException(string.Join("\r\n", errors.Select(_ => _.ErrorMessage)));
}
}
ダイアログやログに残す分には十分ですが、入力するたびに検証結果が欲しい場合は、リアクティブプログラミングを使いましょう
補足
一応、ValidateObjectメソッド以外の作成方法も載せます。
ValidatePropertyメソッド
private string _name;
[Required(ErrorMessage = "入力必須です")]
public string Name
{
get { return _name; }
set
{
Validator.ValidateProperty(value, new ValidationContext(this) { MemberName = "Name" });
_name = value;
}
}
ValidateValueメソッド
private string _name;
[Required(ErrorMessage = "入力必須です")]
public string Name
{
get { return _name; }
set
{
var attr = new RequireAttribute();
attr.ErrorMessage = "入力必須です"
Validator.ValidateValue(value, new ValidationContext(this) { MemberName = "Name" }, new ValidationAttribute[] {attr});
_name = value;
}
}