Прежде всего, спасибо @ 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
ложно, чтобы этот метод работал.Когда validateAllProperties
имеет значение false, проверяются только свойства с атрибутом [Required]
.Это позволяет методу IValidatableObject.Validate()
обрабатывать условные проверки.