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); }
public FluentValidationModelValidator CloneWithCustomizations(CustomizeValidatorAttribute customizations, HttpActionContext context) { return(new FluentValidationModelValidator(ValidatorProviders, _validator) { ActionContext = context, Customizations = customizations }); }
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); }
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()); }
public FluentValidationModelValidator(ModelMetadata modelMetadata, IEnumerable <ModelValidatorProvider> validatorProviders, IValidator validator) : base(validatorProviders) { this.validator = validator; this.customizations = CustomizeValidatorAttribute.GetFromModelMetadata(modelMetadata) ?? new CustomizeValidatorAttribute(); }