コード例 #1
0
 /// <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;
     }));
 }
コード例 #2
0
 /// <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);
 }
コード例 #3
0
 public static extern int CascadeWindows(IntPtr hwndParent, CascadeMode wHow, IntPtr lpRect, uint cKids, IntPtr lpKids);
コード例 #4
0
        /// <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);
        }
コード例 #5
0
        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);
        }
コード例 #6
0
 /// <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;
 }
コード例 #9
0
 protected CommandValidator(CascadeMode cascadeMode = CascadeMode.Stop) => CascadeMode = cascadeMode;