DataAnnotationsとValidatorでデータ検証

投稿者: | 2020年7月19日

ユーザーの入力に間違いがないか検証する方法についてのメモ。

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)