public void ApplyCondition(Func <object, bool> predicate, ApplyConditionTo applyConditionTo = ApplyConditionTo.AllValidators) { // Default behaviour for When/Unless as of v1.3 is to apply the condition to all previous validators in the chain. if (applyConditionTo == ApplyConditionTo.AllValidators) { foreach (var validator in Validators.ToList()) { var wrappedValidator = new DelegatingValidator(predicate, validator); ReplaceValidator(validator, wrappedValidator); } } else { var wrappedValidator = new DelegatingValidator(predicate, CurrentValidator); ReplaceValidator(CurrentValidator, wrappedValidator); } }
/// <summary> /// Specifies a condition limiting when the validator should run. /// The validator will only be executed if the result of the lambda returns true. /// </summary> /// <param name="rule">The current rule</param> /// <param name="predicate">A lambda expression that specifies a condition for when the validator should run</param> /// <param name="applyConditionTo">Whether the condition should be applied to the current rule or all rules in the chain</param> /// <returns></returns> public static IRuleBuilderOptions <T, TProperty> When <T, TProperty>(this IRuleBuilderOptions <T, TProperty> rule, Func <T, bool> predicate, ApplyConditionTo applyConditionTo = ApplyConditionTo.AllValidators) { predicate.Guard("A predicate must be specified when calling When."); return(rule.Configure(config => { // Default behaviour for When/Unless as of v1.3 is to apply the condition to all previous validators in the chain. if (applyConditionTo == ApplyConditionTo.AllValidators) { foreach (var validator in config.Validators.ToList()) { var wrappedValidator = new DelegatingValidator(x => predicate((T)x), validator); config.ReplaceValidator(validator, wrappedValidator); } } else { var wrappedValidator = new DelegatingValidator(x => predicate((T)x), config.CurrentValidator); config.ReplaceValidator(config.CurrentValidator, wrappedValidator); } })); }
/// <summary> /// Applies the condition to the rule asynchronously /// </summary> /// <param name="predicate"></param> /// <param name="applyConditionTo"></param> public void ApplyAsyncCondition(Func <ValidationContext, CancellationToken, Task <bool> > predicate, ApplyConditionTo applyConditionTo = ApplyConditionTo.AllValidators) { // Default behaviour for When/Unless as of v1.3 is to apply the condition to all previous validators in the chain. if (applyConditionTo == ApplyConditionTo.AllValidators) { foreach (var validator in Validators.ToList()) { var wrappedValidator = new DelegatingValidator(predicate, validator); ReplaceValidator(validator, wrappedValidator); } foreach (var dependentRule in DependentRules.ToList()) { dependentRule.ApplyAsyncCondition(predicate, applyConditionTo); } } else { var wrappedValidator = new DelegatingValidator(predicate, CurrentValidator); ReplaceValidator(CurrentValidator, wrappedValidator); } }