一尘不染

如何使用IValidatableObject?

c#

我了解这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.
             */ 
        }
    }
}

阅读 326

收藏
2020-05-19

共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
很重要。如果validateAllProperties为false,则仅[Required]检查具有属性的属性。这使IValidatableObject.Validate()方法可以处理条件验证。

2020-05-19