/// <summary> /// Specifies the cascade mode for failures. /// If set to 'Stop' then execution of the rule will stop once the first validator in the chain fails. /// If set to 'Continue' then all validators in the chain will execute regardless of failures. /// </summary> public static IRuleBuilderInitial <T, TProperty> Cascade <T, TProperty>(this IRuleBuilderInitial <T, TProperty> ruleBuilder, CascadeMode cascadeMode) { return(ruleBuilder.Configure(cfg => { cfg.CascadeMode = cascadeMode; })); }
/// <summary> /// 加载类验证服务 /// </summary> /// <param name="services"></param> /// <param name="cascadeMode">开启全局级联验证模式,当出现一个错误时,不再继续执行;默认开启级联验证</param> public static IServiceCollection AddModelValidation(this IServiceCollection services, CascadeMode cascadeMode = CascadeMode.StopOnFirstFailure) { ValidatorOptions.CascadeMode = cascadeMode; return(services); }
public static extern int CascadeWindows(IntPtr hwndParent, CascadeMode wHow, IntPtr lpRect, uint cKids, IntPtr lpKids);
/// <summary> /// When using the ValidatableProperty type, use this method to avoid needing to supply the ".Value" /// which is needed when using RuleForProp. /// </summary> /// <typeparam name="TType"></typeparam> /// <param name="expression"></param> /// <returns></returns> public IRuleBuilderInitial <T, TType> RuleForProp <TType>(Expression <Func <T, ValidatableProperty <TType> > > expression, CascadeMode cascadeMode = CascadeMode.Continue) { var lambdaExpression = (MemberExpression)expression.Body; var propName = lambdaExpression.Member.Name; var originalPropertyType = typeof(T).GetRuntimeProperty(propName); var actualPropertyToValidate = typeof(ValidatableProperty <TType>).GetRuntimeProperty("Value"); var generatedExpression = Expression.Parameter(typeof(T), "a"); var navigationPropertyAccess = Expression.MakeMemberAccess(generatedExpression, originalPropertyType); var lambdaNameMemberAccess = Expression.MakeMemberAccess(navigationPropertyAccess, actualPropertyToValidate); var lambdaAccess = Expression.Lambda <Func <T, TType> >(lambdaNameMemberAccess, new List <ParameterExpression>() { generatedExpression }); var generatedMember = lambdaAccess.GetMember(); var compiled = generatedMember == null || ValidatorOptions.DisableAccessorCache ? lambdaAccess.Compile() : AccessorCache <T> .GetCachedAccessor(generatedMember, lambdaAccess); var rule = new PropertyRule(generatedMember, compiled.CoerceToNonGeneric(), lambdaAccess, () => cascadeMode, typeof(TType), typeof(T)); AddRule(rule); IRuleBuilderOptions <T, TType> ruleBuilder = new RuleBuilder <T, TType>(rule, this); ruleBuilder = ruleBuilder.WithName(propName); return((IRuleBuilderInitial <T, TType>)ruleBuilder); }
public RuleDescriptor BuildRuleDescription(IEnumerable <IPropertyValidator> validationRules, string propertyName, CascadeMode cascadeMode, PropertyRule rule) { if (validationRules == null) { throw new ArgumentNullException(nameof(validationRules)); } var propertyValidators = validationRules as IList <IPropertyValidator> ?? validationRules.ToList(); if (!propertyValidators.Any()) { throw new InvalidOperationException("No validation rules to document"); } if (string.IsNullOrWhiteSpace(propertyName)) { throw new ArgumentNullException(nameof(propertyName)); } var ruleDescriptor = new RuleDescriptor { MemberName = propertyName }; var ruleDescriptions = new List <RuleDescription>(); foreach (var propertyValidator in propertyValidators) { string validatorName; Severity?validationFailureSeverity; string validationMessage; if (propertyValidator is ChildValidatorAdaptor childValidator) { validatorName = childValidator.ValidatorType.Name; validationFailureSeverity = childValidator.Severity; validationMessage = $"N/A - Refer to specific {validatorName} documentation"; } else { validatorName = propertyValidator.GetType().Name; validationFailureSeverity = propertyValidator.Severity; validationMessage = _validatorErrorMessageBuilder.GetErrorMessage(propertyValidator, rule, propertyName); } ruleDescriptions.Add(new RuleDescription { ValidatorName = validatorName, FailureSeverity = validationFailureSeverity.ToString(), OnFailure = cascadeMode.ToString(), ValidationMessage = validationMessage }); } ruleDescriptor.Rules = ruleDescriptions; return(ruleDescriptor); }
/// <summary> /// Specifies the cascade mode for failures. /// If set to 'Stop' then execution of the rule will stop once the first validator in the chain fails. /// If set to 'Continue' then all validators in the chain will execute regardless of failures. /// </summary> public static IRuleBuilderInitial <T, TProperty> Cascade <T, TProperty>(this IRuleBuilderInitial <T, TProperty> ruleBuilder, CascadeMode cascadeMode) { Configurable(ruleBuilder).CascadeMode = cascadeMode; return(ruleBuilder); }
private static void SetBothGlobalCascadeModes(CascadeMode cascadeMode) { ValidatorOptions.Global.DefaultClassLevelCascadeMode = cascadeMode; ValidatorOptions.Global.DefaultRuleLevelCascadeMode = cascadeMode; }
private void SetBothValidatorCascadeModes(CascadeMode cascadeMode) { _validator.ClassLevelCascadeMode = cascadeMode; _validator.RuleLevelCascadeMode = cascadeMode; }
protected CommandValidator(CascadeMode cascadeMode = CascadeMode.Stop) => CascadeMode = cascadeMode;