protected override bool ValidateNodeAndChildren(ModelMetadata metadata, BodyModelValidatorContext validationContext, object container, IEnumerable <ModelValidator> validators)
        {
            CustomizeValidatorAttribute customizations = null;

            if (validationContext.ActionContext.Request.Properties.ContainsKey("_FV_Customizations"))
            {
                customizations = validationContext.ActionContext.Request.Properties["_FV_Customizations"] as CustomizeValidatorAttribute;
            }

            if (customizations == null)
            {
                customizations = new CustomizeValidatorAttribute();
            }

            if (validators == null)
            {
                validators = GetValidators(validationContext.ActionContext, metadata, validationContext.ValidatorCache);
            }

            validators = ApplyCustomizationsToValidators(validators, customizations, validationContext.ActionContext);

            bool isValid = base.ValidateNodeAndChildren(metadata, validationContext, container, validators);

            var model = GetModel(metadata);

            if (!isValid && model != null && !HasAlreadyBeenValidated(validationContext, model))
            {
                // default impl skips validating root node if any children fail, so we explicitly validate it in this scenario
                var rootModelValidators = validationContext.ActionContext.GetValidators(metadata);
                rootModelValidators = ApplyCustomizationsToValidators(rootModelValidators, customizations, validationContext.ActionContext);
                var rootIsValid = ShallowValidate(metadata, validationContext, container, rootModelValidators);
                return(rootIsValid && isValid);
            }
            return(isValid);
        }
Esempio n. 2
0
 public FluentValidationModelValidator CloneWithCustomizations(CustomizeValidatorAttribute customizations, HttpActionContext context)
 {
     return(new FluentValidationModelValidator(ValidatorProviders, _validator)
     {
         ActionContext = context,
         Customizations = customizations
     });
 }
Esempio n. 3
0
        protected override bool ValidateNodeAndChildren(ModelMetadata metadata, BodyModelValidatorContext validationContext, object container, IEnumerable <ModelValidator> validators)
        {
            CustomizeValidatorAttribute customizations = null;

            if (validationContext.ActionContext.Request.Properties.ContainsKey("_FV_Customizations"))
            {
                customizations = validationContext.ActionContext.Request.Properties["_FV_Customizations"] as CustomizeValidatorAttribute;
            }

            if (customizations == null)
            {
                customizations = new CustomizeValidatorAttribute();
            }

            if (validators == null)
            {
                validators = GetValidators(validationContext.ActionContext, metadata, validationContext.ValidatorCache);
            }

            validators = ApplyCustomizationsToValidators(validators, customizations, validationContext.ActionContext);

            bool isValid = !ImplicitlyValidateChildProperties || base.ValidateNodeAndChildren(metadata, validationContext, container, validators);

            var model = GetModel(metadata);

            if ((!isValid || !ImplicitlyValidateChildProperties) && model != null && !HasAlreadyBeenValidated(validationContext, model))
            {
                // default impl skips validating root node if any children fail, so we explicitly validate it in this scenario.
                // Only do this for FV validators, otherwise DataAnnotations ends up generating duplicate messages
                // as it runs during both property validation phase and model validation phase.
                var fvRootModelValidators = validationContext.ActionContext.GetValidators(metadata)
                                            .OfType <FluentValidationModelValidator>()
                                            .ToList();

                if (fvRootModelValidators.Count > 0)
                {
                    var validatorsWithCustomizations = ApplyCustomizationsToValidators(fvRootModelValidators, customizations, validationContext.ActionContext);
                    return(ShallowValidate(metadata, validationContext, container, validatorsWithCustomizations));
                }
            }

            return(isValid);
        }
Esempio n. 4
0
        private IEnumerable <ModelValidator> ApplyCustomizationsToValidators(IEnumerable <ModelValidator> validators, CustomizeValidatorAttribute customizations, HttpActionContext ctx)
        {
            if (validators == null)
            {
                return(null);
            }
            // For the FV-specific model validator, clone it passing the context and customizations to the clone
            // This is done rather than setting them on the original validator so we don't up with stale contexts in WebApi's cache
            var projection = from validator in validators
                             let fluentValidator = validator as FluentValidationModelValidator
                                                   let needsCustomiations = fluentValidator != null && fluentValidator.Customizations == null
                                                                            let newValidator = needsCustomiations ? (ModelValidator)fluentValidator.CloneWithCustomizations(customizations, ctx) : validator
                                                                                               select newValidator;

            return(projection.ToList());
        }
Esempio n. 5
0
 public FluentValidationModelValidator(ModelMetadata modelMetadata, IEnumerable <ModelValidatorProvider> validatorProviders, IValidator validator)
     : base(validatorProviders)
 {
     this.validator      = validator;
     this.customizations = CustomizeValidatorAttribute.GetFromModelMetadata(modelMetadata) ?? new CustomizeValidatorAttribute();
 }