使用ivalidatableObject
> IValidatableObject
接口提供了一种在.NET中执行综合对象验证的有力方法,包括交叉特性检查。但是,基于某些条件的选择性忽略验证规则可能很棘手。 此示例演示了如何有效地实现条件性属性验证。
以下是一个代码段,说明了实现:
<code class="language-csharp">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 (Enable) { // Conditionally validate Prop1 and Prop2 Validator.TryValidateProperty(Prop1, new ValidationContext(this, null, null) { MemberName = "Prop1" }, results); Validator.TryValidateProperty(Prop2, new ValidationContext(this, null, null) { MemberName = "Prop2" }, results); // Add a custom conditional validation rule if (Prop1 > Prop2) { results.Add(new ValidationResult("Prop1 must be less than or equal to Prop2")); } } return results; } }</code>
此代码使用Enable
属性来控制验证。 如果Enable
为true,则使用Prop1
>属性验证Prop2
>> [Range]
Prop1
>确保Prop2
>的自定义规则不大于Validator.TryValidateProperty()
>。 results
方法是关键;它仅在验证失败时将验证错误添加到
>
使用此验证:<code class="language-csharp">public void PerformValidation() { var toValidate = new ValidateMe { Enable = true, Prop1 = 6, //This will cause a validation error Prop2 = 2 }; bool validateAllProperties = false; // Important: Set to false for conditional validation var results = new List<ValidationResult>(); bool isValid = Validator.TryValidateObject(toValidate, new ValidationContext(toValidate, null, null), results, validateAllProperties); //Process validation results (results list) }</code>
validateAllProperties
设置false
Validator.TryValidateObject()
至关重要。 这样可以防止IValidatableObject
覆盖条件验证逻辑。 此方法结合了.NET应用程序中灵活和可靠的对象验证的有条件验证。
以上是如何使用.NET中的IvalidatableObject实施条件属性验证?的详细内容。更多信息请关注PHP中文网其他相关文章!