How do I use IValidatableObject?

前端 未结 7 1673
我在风中等你
我在风中等你 2020-11-22 02:59

I understand that IValidatableObject is used to validate an object in a way that lets one compare properties against each other.

I\'d still like to have

7条回答
  •  无人及你
    2020-11-22 04:02

    First off, thanks to @paper1337 for pointing me to the right resources...I'm not registered so I can't vote him up, please do so if anybody else reads this.

    Here's how to accomplish what I was trying to do.

    Validatable class:

    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 Validate(ValidationContext validationContext)
        {
            var results = new List();
            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;
        }
    }
    

    Using Validator.TryValidateProperty() will add to the results collection if there are failed validations. If there is not a failed validation then nothing will be add to the result collection which is an indication of success.

    Doing the validation:

        public void DoValidation()
        {
            var toValidate = new ValidateMe()
            {
                Enable = true,
                Prop1 = 1,
                Prop2 = 2
            };
    
            bool validateAllProperties = false;
    
            var results = new List();
    
            bool isValid = Validator.TryValidateObject(
                toValidate,
                new ValidationContext(toValidate, null, null),
                results,
                validateAllProperties);
        }
    

    It is important to set validateAllProperties to false for this method to work. When validateAllProperties is false only properties with a [Required] attribute are checked. This allows the IValidatableObject.Validate() method handle the conditional validations.

提交回复
热议问题