IValidatableObject の使い方は? 質問する

IValidatableObject の使い方は? 質問する

IValidatableObjectプロパティを相互に比較できる方法でオブジェクトを検証するために使用されることを理解しています。

個々のプロパティを検証するための属性は引き続き必要ですが、特定のケースでは一部のプロパティの失敗を無視したいと思います。

以下のケースでは、これを間違って使用しようとしていますか? そうでない場合、これをどのように実装しますか?

public class ValidateMe : IValidatableObject
{
    [Required]
    public bool Enable { get; set; }

    [Range(1, 5)]
    public int Prop1 { get; set; }

    [Range(1, 5)]
    public int Prop2 { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (!this.Enable)
        {
            /* Return valid result here.
             * I don't care if Prop1 and Prop2 are out of range
             * if the whole object is not "enabled"
             */
        }
        else
        {
            /* Check if Prop1 and Prop2 meet their range requirements here
             * and return accordingly.
             */ 
        }
    }
}

ベストアンサー1

まず最初に、正しいリソースを教えてくれた @paper1337 に感謝します。私は登録していないので彼に投票できませんが、もし他の誰かがこれを読んだら、ぜひ投票してください。

私がやろうとしていたことを実現する方法は次のとおりです。

検証可能なクラス:

public class ValidateMe : IValidatableObject
{
    [Required]
    public bool Enable { get; set; }

    [Range(1, 5)]
    public int Prop1 { get; set; }

    [Range(1, 5)]
    public int Prop2 { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        var results = new List<ValidationResult>();
        if (this.Enable)
        {
            Validator.TryValidateProperty(this.Prop1,
                new ValidationContext(this, null, null) { MemberName = "Prop1" },
                results);
            Validator.TryValidateProperty(this.Prop2,
                new ValidationContext(this, null, null) { MemberName = "Prop2" },
                results);

            // some other random test
            if (this.Prop1 > this.Prop2)
            {
                results.Add(new ValidationResult("Prop1 must be larger than Prop2"));
            }
        }
        return results;
    }
}

を使用するとValidator.TryValidateProperty()、検証に失敗した場合に結果コレクションに追加されます。検証に失敗しなかった場合は、結果コレクションに何も追加されず、成功を示します。

検証の実行:

    public void DoValidation()
    {
        var toValidate = new ValidateMe()
        {
            Enable = true,
            Prop1 = 1,
            Prop2 = 2
        };

        bool validateAllProperties = false;

        var results = new List<ValidationResult>();

        bool isValid = Validator.TryValidateObject(
            toValidate,
            new ValidationContext(toValidate, null, null),
            results,
            validateAllProperties);
    }

validateAllPropertiesこのメソッドが機能するには、 false に設定することが重要です。 validateAllPropertiesfalse の場合、属性を持つプロパティのみが[Required]チェックされます。これにより、IValidatableObject.Validate()メソッドは条件付き検証を処理できます。

おすすめ記事