Exemple #1
0
        /// <summary>
        /// Updates the specified <paramref name="model"/> instance using the specified <paramref name="modelBinder"/>
        /// and the specified <paramref name="valueProvider"/> and executes validation using the specified
        /// <paramref name="validatorProvider"/>.
        /// </summary>
        /// <typeparam name="TModel">The type of the model object.</typeparam>
        /// <param name="model">The model instance to update and validate.</param>
        /// <param name="prefix">The prefix to use when looking up values in the <paramref name="valueProvider"/>.
        /// </param>
        /// <param name="httpContext">The <see cref="HttpContext"/> for the current executing request.</param>
        /// <param name="modelState">The <see cref="ModelStateDictionary"/> used for maintaining state and
        /// results of model-binding validation.</param>
        /// <param name="metadataProvider">The provider used for reading metadata for the model type.</param>
        /// <param name="modelBinder">The <see cref="IModelBinder"/> used for binding.</param>
        /// <param name="valueProvider">The <see cref="IValueProvider"/> used for looking up values.</param>
        /// <param name="inputFormatters">
        /// The set of <see cref="IInputFormatter"/> instances for deserializing the body.
        /// </param>
        /// <param name="objectModelValidator">The <see cref="IObjectModelValidator"/> used for validating the
        /// bound values.</param>
        /// <param name="validatorProvider">The <see cref="IModelValidatorProvider"/> used for executing validation
        /// on the model
        /// instance.</param>
        /// <param name="includeExpressions">Expression(s) which represent top level properties
        /// which need to be included for the current model.</param>
        /// <returns>A <see cref="Task"/> that on completion returns <c>true</c> if the update is successful</returns>
        public static Task <bool> TryUpdateModelAsync <TModel>(
            [NotNull] TModel model,
            [NotNull] string prefix,
            [NotNull] HttpContext httpContext,
            [NotNull] ModelStateDictionary modelState,
            [NotNull] IModelMetadataProvider metadataProvider,
            [NotNull] IModelBinder modelBinder,
            [NotNull] IValueProvider valueProvider,
            [NotNull] IList <IInputFormatter> inputFormatters,
            [NotNull] IObjectModelValidator objectModelValidator,
            [NotNull] IModelValidatorProvider validatorProvider,
            [NotNull] params Expression <Func <TModel, object> >[] includeExpressions)
            where TModel : class
        {
            var includeExpression = GetIncludePredicateExpression(prefix, includeExpressions);
            var predicate         = includeExpression.Compile();

            return(TryUpdateModelAsync(
                       model,
                       prefix,
                       httpContext,
                       modelState,
                       metadataProvider,
                       modelBinder,
                       valueProvider,
                       inputFormatters,
                       objectModelValidator,
                       validatorProvider,
                       predicate: predicate));
        }
        public void CreateValidationMetadata_SetsHasValidatorsToTrue_IfProviderReturnsTrue()
        {
            // Arrange
            var metadataBasedModelValidatorProvider = new Mock <IMetadataBasedModelValidatorProvider>();

            metadataBasedModelValidatorProvider.Setup(p => p.HasValidators(typeof(object), It.IsAny <IList <object> >()))
            .Returns(true)
            .Verifiable();

            var validationProviders = new IModelValidatorProvider[]
            {
                new DefaultModelValidatorProvider(),
                metadataBasedModelValidatorProvider.Object,
            };
            var metadataProvider = new HasValidatorsValidationMetadataProvider(validationProviders);

            var key             = ModelMetadataIdentity.ForType(typeof(object));
            var modelAttributes = new ModelAttributes(new object[0], new object[0], new object[0]);
            var context         = new ValidationMetadataProviderContext(key, modelAttributes);

            // Act
            metadataProvider.CreateValidationMetadata(context);

            // Assert
            Assert.True(context.ValidationMetadata.HasValidators);
            metadataBasedModelValidatorProvider.Verify();
        }
        /// <inheritdoc />
        public void Validate(
            IModelValidatorProvider validatorProvider,
            ModelStateDictionary modelState,
            ValidationStateDictionary validationState,
            string prefix,
            object model)
        {
            if (validatorProvider == null)
            {
                throw new ArgumentNullException(nameof(validatorProvider));
            }

            if (modelState == null)
            {
                throw new ArgumentNullException(nameof(modelState));
            }

            var visitor = new ValidationVisitor(
                validatorProvider,
                _excludeFilters,
                modelState,
                validationState);

            var metadata = model == null ? null : _modelMetadataProvider.GetMetadataForType(model.GetType());
            visitor.Validate(metadata, prefix, model);
        }
Exemple #4
0
 /// <summary>
 /// Updates the specified <paramref name="model"/> instance using the specified <paramref name="modelBinder"/>
 /// and the specified <paramref name="valueProvider"/> and executes validation using the specified
 /// <paramref name="validatorProvider"/>.
 /// </summary>
 /// <param name="model">The model instance to update and validate.</param>
 /// <param name="modelType">The type of model instance to update and validate.</param>
 /// <param name="prefix">The prefix to use when looking up values in the <paramref name="valueProvider"/>.
 /// </param>
 /// <param name="httpContext">The <see cref="HttpContext"/> for the current executing request.</param>
 /// <param name="modelState">The <see cref="ModelStateDictionary"/> used for maintaining state and
 /// results of model-binding validation.</param>
 /// <param name="metadataProvider">The provider used for reading metadata for the model type.</param>
 /// <param name="modelBinder">The <see cref="IModelBinder"/> used for binding.</param>
 /// <param name="valueProvider">The <see cref="IValueProvider"/> used for looking up values.</param>
 /// <param name="objectModelValidator">The <see cref="IObjectModelValidator"/> used for validating the
 /// bound values.</param>
 /// <param name="validatorProvider">The <see cref="IModelValidatorProvider"/> used for executing validation
 /// on the model instance.</param>
 /// <returns>A <see cref="Task"/> that on completion returns <c>true</c> if the update is successful</returns>
 public static Task <bool> TryUpdateModelAsync(
     [NotNull] object model,
     [NotNull] Type modelType,
     [NotNull] string prefix,
     [NotNull] HttpContext httpContext,
     [NotNull] ModelStateDictionary modelState,
     [NotNull] IModelMetadataProvider metadataProvider,
     [NotNull] IModelBinder modelBinder,
     [NotNull] IValueProvider valueProvider,
     [NotNull] IObjectModelValidator objectModelValidator,
     [NotNull] IModelValidatorProvider validatorProvider)
 {
     // Includes everything by default.
     return(TryUpdateModelAsync(
                model,
                modelType,
                prefix,
                httpContext,
                modelState,
                metadataProvider,
                modelBinder,
                valueProvider,
                objectModelValidator,
                validatorProvider,
                predicate: (context, propertyName) => true));
 }
Exemple #5
0
 /// <summary>
 /// Updates the specified <paramref name="model"/> instance using the specified <paramref name="modelBinder"/>
 /// and the specified <paramref name="valueProvider"/> and executes validation using the specified
 /// <paramref name="validatorProvider"/>.
 /// </summary>
 /// <typeparam name="TModel">The type of the model object.</typeparam>
 /// <param name="model">The model instance to update and validate.</param>
 /// <param name="prefix">The prefix to use when looking up values in the <paramref name="valueProvider"/>.
 /// </param>
 /// <param name="httpContext">The <see cref="HttpContext"/> for the current executing request.</param>
 /// <param name="modelState">The <see cref="ModelStateDictionary"/> used for maintaining state and
 /// results of model-binding validation.</param>
 /// <param name="metadataProvider">The provider used for reading metadata for the model type.</param>
 /// <param name="modelBinder">The <see cref="IModelBinder"/> used for binding.</param>
 /// <param name="valueProvider">The <see cref="IValueProvider"/> used for looking up values.</param>
 /// <param name="inputFormatters">
 /// The set of <see cref="IInputFormatter"/> instances for deserializing the body.
 /// </param>
 /// <param name="objectModelValidator">The <see cref="IObjectModelValidator"/> used for validating the
 /// bound values.</param>
 /// <param name="validatorProvider">The <see cref="IModelValidatorProvider"/> used for executing validation
 /// on the model instance.</param>
 /// <returns>A <see cref="Task"/> that on completion returns <c>true</c> if the update is successful</returns>
 public static Task <bool> TryUpdateModelAsync <TModel>(
     [NotNull] TModel model,
     [NotNull] string prefix,
     [NotNull] HttpContext httpContext,
     [NotNull] ModelStateDictionary modelState,
     [NotNull] IModelMetadataProvider metadataProvider,
     [NotNull] IModelBinder modelBinder,
     [NotNull] IValueProvider valueProvider,
     [NotNull] IList <IInputFormatter> inputFormatters,
     [NotNull] IObjectModelValidator objectModelValidator,
     [NotNull] IModelValidatorProvider validatorProvider)
     where TModel : class
 {
     // Includes everything by default.
     return(TryUpdateModelAsync(
                model,
                prefix,
                httpContext,
                modelState,
                metadataProvider,
                modelBinder,
                valueProvider,
                inputFormatters,
                objectModelValidator,
                validatorProvider,
                predicate: (context, propertyName) => true));
 }
        /// <inheritdoc />
        public void Validate(
            ActionContext actionContext,
            IModelValidatorProvider validatorProvider,
            ValidationStateDictionary validationState,
            string prefix,
            object model)
        {
            if (actionContext == null)
            {
                throw new ArgumentNullException(nameof(actionContext));
            }

            if (validatorProvider == null)
            {
                throw new ArgumentNullException(nameof(validatorProvider));
            }

            var visitor = new ValidationVisitor(
                actionContext,
                validatorProvider,
                _validatorCache,
                _modelMetadataProvider,
                validationState);

            var metadata = model == null ? null : _modelMetadataProvider.GetMetadataForType(model.GetType());
            visitor.Validate(metadata, prefix, model);
        }
Exemple #7
0
        /// <summary>
        /// Creates a new <see cref="ValidationVisitor"/>.
        /// </summary>
        /// <param name="validatorProvider">The <see cref="IModelValidatorProvider"/>.</param>
        /// <param name="excludeFilters">The list of <see cref="IExcludeTypeValidationFilter"/>.</param>
        /// <param name="modelState">The <see cref="ModelStateDictionary"/>.</param>
        /// <param name="validationState">The <see cref="ValidationStateDictionary"/>.</param>
        public ValidationVisitor(
            IModelValidatorProvider validatorProvider,
            IList <IExcludeTypeValidationFilter> excludeFilters,
            ModelStateDictionary modelState,
            ValidationStateDictionary validationState)
        {
            if (validatorProvider == null)
            {
                throw new ArgumentNullException(nameof(validatorProvider));
            }

            if (excludeFilters == null)
            {
                throw new ArgumentNullException(nameof(excludeFilters));
            }

            if (modelState == null)
            {
                throw new ArgumentNullException(nameof(modelState));
            }

            _validatorProvider = validatorProvider;
            _excludeFilters    = excludeFilters;
            _modelState        = modelState;
            _validationState   = validationState;

            _currentPath = new HashSet <object>(ReferenceEqualityComparer.Instance);
        }
Exemple #8
0
        private ParameterBinder(
            IModelMetadataProvider modelMetadataProvider,
            IModelBinderFactory modelBinderFactory,
            IModelValidatorProvider validatorProvider,
            IObjectModelValidator validatorForBackCompatOnly,
            ILoggerFactory loggerFactory)
        {
            if (modelMetadataProvider == null)
            {
                throw new ArgumentNullException(nameof(modelMetadataProvider));
            }

            if (modelBinderFactory == null)
            {
                throw new ArgumentNullException(nameof(modelBinderFactory));
            }

            if (loggerFactory == null)
            {
                throw new ArgumentNullException(nameof(loggerFactory));
            }

            _modelMetadataProvider      = modelMetadataProvider;
            _modelBinderFactory         = modelBinderFactory;
            _validatorProvider          = validatorProvider;
            _validatorForBackCompatOnly = validatorForBackCompatOnly;
            _validatorCache             = new ValidatorCache();
            Logger = loggerFactory.CreateLogger(GetType());
        }
Exemple #9
0
 /// <summary>
 /// Updates the specified <paramref name="model"/> instance using the specified <paramref name="modelBinder"/>
 /// and the specified <paramref name="valueProvider"/> and executes validation using the specified
 /// <paramref name="validatorProvider"/>.
 /// </summary>
 /// <typeparam name="TModel">The type of the model object.</typeparam>
 /// <param name="model">The model instance to update and validate.</param>
 /// <param name="prefix">The prefix to use when looking up values in the <paramref name="valueProvider"/>.
 /// </param>
 /// <param name="httpContext">The <see cref="HttpContext"/> for the current executing request.</param>
 /// <param name="modelState">The <see cref="ModelStateDictionary"/> used for maintaining state and
 /// results of model-binding validation.</param>
 /// <param name="metadataProvider">The provider used for reading metadata for the model type.</param>
 /// <param name="modelBinder">The <see cref="IModelBinder"/> used for binding.</param>
 /// <param name="valueProvider">The <see cref="IValueProvider"/> used for looking up values.</param>
 /// <param name="inputFormatters">
 /// The set of <see cref="IInputFormatter"/> instances for deserializing the body.
 /// </param>
 /// <param name="objectModelValidator">The <see cref="IObjectModelValidator"/> used for validating the
 /// bound values.</param>
 /// <param name="validatorProvider">The <see cref="IModelValidatorProvider"/> used for executing validation
 /// on the model instance.</param>
 /// <param name="predicate">A predicate which can be used to
 /// filter properties(for inclusion/exclusion) at runtime.</param>
 /// <returns>A <see cref="Task"/> that on completion returns <c>true</c> if the update is successful</returns>
 public static Task <bool> TryUpdateModelAsync <TModel>(
     [NotNull] TModel model,
     [NotNull] string prefix,
     [NotNull] HttpContext httpContext,
     [NotNull] ModelStateDictionary modelState,
     [NotNull] IModelMetadataProvider metadataProvider,
     [NotNull] IModelBinder modelBinder,
     [NotNull] IValueProvider valueProvider,
     [NotNull] IList <IInputFormatter> inputFormatters,
     [NotNull] IObjectModelValidator objectModelValidator,
     [NotNull] IModelValidatorProvider validatorProvider,
     [NotNull] Func <ModelBindingContext, string, bool> predicate)
     where TModel : class
 {
     return(TryUpdateModelAsync(
                model,
                typeof(TModel),
                prefix,
                httpContext,
                modelState,
                metadataProvider,
                modelBinder,
                valueProvider,
                inputFormatters,
                objectModelValidator,
                validatorProvider,
                predicate: predicate));
 }
        /// <inheritdoc />
        public void Validate(
            ActionContext actionContext,
            IModelValidatorProvider validatorProvider,
            ValidationStateDictionary validationState,
            string prefix,
            object model)
        {
            if (actionContext == null)
            {
                throw new ArgumentNullException(nameof(actionContext));
            }

            if (validatorProvider == null)
            {
                throw new ArgumentNullException(nameof(validatorProvider));
            }

            var visitor = new ValidationVisitor(
                actionContext,
                validatorProvider,
                _validatorCache,
                _modelMetadataProvider,
                validationState);

            var metadata = model == null ? null : _modelMetadataProvider.GetMetadataForType(model.GetType());

            visitor.Validate(metadata, prefix, model);
        }
Exemple #11
0
        /// <inheritdoc />
        public void Validate(
            IModelValidatorProvider validatorProvider,
            ModelStateDictionary modelState,
            ValidationStateDictionary validationState,
            string prefix,
            object model)
        {
            if (validatorProvider == null)
            {
                throw new ArgumentNullException(nameof(validatorProvider));
            }

            if (modelState == null)
            {
                throw new ArgumentNullException(nameof(modelState));
            }

            var visitor = new ValidationVisitor(
                validatorProvider,
                _excludeFilters,
                modelState,
                validationState);

            var metadata = model == null ? null : _modelMetadataProvider.GetMetadataForType(model.GetType());

            visitor.Validate(metadata, prefix, model);
        }
        /// <summary>
        /// Creates a new <see cref="ValidationVisitor"/>.
        /// </summary>
        /// <param name="actionContext">The <see cref="ActionContext"/> associated with the current request.</param>
        /// <param name="validatorProvider">The <see cref="IModelValidatorProvider"/>.</param>
        /// <param name="validatorCache">The <see cref="ValidatorCache"/> that provides a list of <see cref="IModelValidator"/>s.</param>
        /// <param name="metadataProvider">The provider used for reading metadata for the model type.</param>
        /// <param name="validationState">The <see cref="ValidationStateDictionary"/>.</param>
        public ValidationVisitor(
            ActionContext actionContext,
            IModelValidatorProvider validatorProvider,
            ValidatorCache validatorCache,
            IModelMetadataProvider metadataProvider,
            ValidationStateDictionary validationState)
        {
            if (actionContext == null)
            {
                throw new ArgumentNullException(nameof(actionContext));
            }

            if (validatorProvider == null)
            {
                throw new ArgumentNullException(nameof(validatorProvider));
            }

            if (validatorCache == null)
            {
                throw new ArgumentNullException(nameof(validatorCache));
            }

            _actionContext     = actionContext;
            _validatorProvider = validatorProvider;
            _validatorCache    = validatorCache;

            _metadataProvider = metadataProvider;
            _validationState  = validationState;

            _modelState  = actionContext.ModelState;
            _currentPath = new HashSet <object>(ReferenceEqualityComparer.Instance);
        }
Exemple #13
0
        /// <summary>
        /// Creates a new <see cref="ValidationVisitor"/>.
        /// </summary>
        /// <param name="actionContext">The <see cref="ActionContext"/> associated with the current request.</param>
        /// <param name="validatorProvider">The <see cref="IModelValidatorProvider"/>.</param>
        /// <param name="validatorCache">The <see cref="ValidatorCache"/> that provides a list of <see cref="IModelValidator"/>s.</param>
        /// <param name="metadataProvider">The provider used for reading metadata for the model type.</param>
        /// <param name="validationState">The <see cref="ValidationStateDictionary"/>.</param>
        public ValidationVisitor(
            ActionContext actionContext,
            IModelValidatorProvider validatorProvider,
#pragma warning disable PUB0001 // Pubternal type in public API
            ValidatorCache validatorCache,
#pragma warning restore PUB0001
            IModelMetadataProvider metadataProvider,
            ValidationStateDictionary validationState)
        {
            if (actionContext == null)
            {
                throw new ArgumentNullException(nameof(actionContext));
            }

            if (validatorProvider == null)
            {
                throw new ArgumentNullException(nameof(validatorProvider));
            }

            if (validatorCache == null)
            {
                throw new ArgumentNullException(nameof(validatorCache));
            }

            Context           = actionContext;
            ValidatorProvider = validatorProvider;
            Cache             = validatorCache;

            MetadataProvider = metadataProvider;
            ValidationState  = validationState;

            ModelState  = actionContext.ModelState;
            CurrentPath = new ValidationStack();
        }
Exemple #14
0
        /// <summary>
        /// Creates a new <see cref="ValidationVisitor"/>.
        /// </summary>
        /// <param name="actionContext">The <see cref="ActionContext"/> associated with the current request.</param>
        /// <param name="validatorProvider">The <see cref="IModelValidatorProvider"/>.</param>
        /// <param name="validatorCache">The <see cref="ValidatorCache"/> that provides a list of <see cref="IModelValidator"/>s.</param>
        /// <param name="metadataProvider">The provider used for reading metadata for the model type.</param>
        /// <param name="validationState">The <see cref="ValidationStateDictionary"/>.</param>
        public ValidationVisitor(
            ActionContext actionContext,
            IModelValidatorProvider validatorProvider,
            ValidatorCache validatorCache,
            IModelMetadataProvider metadataProvider,
            ValidationStateDictionary validationState)
        {
            if (actionContext == null)
            {
                throw new ArgumentNullException(nameof(actionContext));
            }

            if (validatorProvider == null)
            {
                throw new ArgumentNullException(nameof(validatorProvider));
            }

            if (validatorCache == null)
            {
                throw new ArgumentNullException(nameof(validatorCache));
            }

            _actionContext     = actionContext;
            _validatorProvider = validatorProvider;
            _validatorCache    = validatorCache;

            _metadataProvider = metadataProvider;
            _validationState  = validationState;

            _modelState  = actionContext.ModelState;
            _currentPath = new ValidationStack();
        }
Exemple #15
0
        /// <summary>
        /// Updates the specified <paramref name="model"/> instance using the specified <paramref name="modelBinder"/>
        /// and the specified <paramref name="valueProvider"/> and executes validation using the specified
        /// <paramref name="validatorProvider"/>.
        /// </summary>
        /// <param name="model">The model instance to update and validate.</param>
        /// <param name="modelType">The type of model instance to update and validate.</param>
        /// <param name="prefix">The prefix to use when looking up values in the <paramref name="valueProvider"/>.
        /// </param>
        /// <param name="httpContext">The <see cref="HttpContext"/> for the current executing request.</param>
        /// <param name="modelState">The <see cref="ModelStateDictionary"/> used for maintaining state and
        /// results of model-binding validation.</param>
        /// <param name="metadataProvider">The provider used for reading metadata for the model type.</param>
        /// <param name="modelBinder">The <see cref="IModelBinder"/> used for binding.</param>
        /// <param name="valueProvider">The <see cref="IValueProvider"/> used for looking up values.</param>
        /// <param name="objectModelValidator">The <see cref="IObjectModelValidator"/> used for validating the
        /// bound values.</param>
        /// <param name="validatorProvider">The <see cref="IModelValidatorProvider"/> used for executing validation
        /// on the model instance.</param>
        /// <param name="predicate">A predicate which can be used to
        /// filter properties(for inclusion/exclusion) at runtime.</param>
        /// <returns>A <see cref="Task"/> that on completion returns <c>true</c> if the update is successful</returns>
        public static async Task <bool> TryUpdateModelAsync(
            [NotNull] object model,
            [NotNull] Type modelType,
            [NotNull] string prefix,
            [NotNull] HttpContext httpContext,
            [NotNull] ModelStateDictionary modelState,
            [NotNull] IModelMetadataProvider metadataProvider,
            [NotNull] IModelBinder modelBinder,
            [NotNull] IValueProvider valueProvider,
            [NotNull] IObjectModelValidator objectModelValidator,
            [NotNull] IModelValidatorProvider validatorProvider,
            [NotNull] Func <ModelBindingContext, string, bool> predicate)
        {
            if (!modelType.IsAssignableFrom(model.GetType()))
            {
                var message = Resources.FormatModelType_WrongType(
                    model.GetType().FullName,
                    modelType.FullName);
                throw new ArgumentException(message, nameof(modelType));
            }

            var modelMetadata = metadataProvider.GetMetadataForType(modelType);

            // Clear ModelStateDictionary entries for the model so that it will be re-validated.
            ClearValidationStateForModel(modelType, modelState, metadataProvider, prefix);

            var operationBindingContext = new OperationBindingContext
            {
                ModelBinder       = modelBinder,
                ValidatorProvider = validatorProvider,
                MetadataProvider  = metadataProvider,
                HttpContext       = httpContext
            };

            var modelBindingContext = new ModelBindingContext
            {
                Model                   = model,
                ModelMetadata           = modelMetadata,
                ModelName               = prefix,
                ModelState              = modelState,
                ValueProvider           = valueProvider,
                FallbackToEmptyPrefix   = true,
                OperationBindingContext = operationBindingContext,
                PropertyFilter          = predicate
            };

            var modelBindingResult = await modelBinder.BindModelAsync(modelBindingContext);

            if (modelBindingResult != null)
            {
                var modelExplorer          = new ModelExplorer(metadataProvider, modelMetadata, modelBindingResult.Model);
                var modelValidationContext = new ModelValidationContext(modelBindingContext, modelExplorer);
                modelValidationContext.RootPrefix = prefix;
                objectModelValidator.Validate(modelValidationContext);
                return(modelState.IsValid);
            }

            return(false);
        }
        /// <summary>
        /// Gets a <see cref="ValidationVisitor"/> that traverses the object model graph and performs validation.
        /// </summary>
        /// <param name="actionContext">The <see cref="ActionContext"/>.</param>
        /// <param name="validatorProvider">The <see cref="IModelValidatorProvider"/>.</param>
        /// <param name="validatorCache">The <see cref="ValidatorCache"/>.</param>
        /// <param name="metadataProvider">The <see cref="IModelMetadataProvider"/>.</param>
        /// <param name="validationState">The <see cref="ValidationStateDictionary"/>.</param>
        /// <returns>A <see cref="ValidationVisitor"/> which traverses the object model graph.</returns>
        public abstract ValidationVisitor GetValidationVisitor(
            ActionContext actionContext,
            IModelValidatorProvider validatorProvider,
#pragma warning disable PUB0001 // Pubternal type in public API
            ValidatorCache validatorCache,
#pragma warning restore PUB0001
            IModelMetadataProvider metadataProvider,
            ValidationStateDictionary validationState);
Exemple #17
0
        public void Validate(ActionContext actionContext, IModelValidatorProvider validatorProvider,
                             ValidationStateDictionary validationState, string prefix, object model)
        {
            if (actionContext == null)
            {
                throw new ArgumentNullException(nameof(actionContext));
            }

            // would model ever be null ??

            if (model == null)
            {
                return;
            }

            // get our IValidator

            var validator = _validatorFactory.GetValidator(model.GetType());

            if (validator == null)
            {
                return;
            }

            foreach (var value in actionContext.ModelState.Values
                     .Where(v => v.ValidationState == ModelValidationState.Unvalidated))
            {
                // Set all unvalidated states to valid. If we end up adding an error below then that properties state
                // will become ModelValidationState.Invalid and will set ModelState.IsValid to false

                value.ValidationState = ModelValidationState.Valid;
            }



            // validate the model using Fluent Validation rules

            var result = validator.Validate(model);

            // add all our model errors to the modelstate

            if (!string.IsNullOrEmpty(prefix))
            {
                prefix = prefix + ".";
            }

            foreach (var modelError in result.Errors)
            {
                // See if there's already an item in the ModelState for this key.
                if (actionContext.ModelState.ContainsKey(modelError.PropertyName))
                {
                    actionContext.ModelState[modelError.PropertyName].Errors.Clear();
                }


                actionContext.ModelState.AddModelError(prefix + modelError.PropertyName, modelError.ErrorMessage);
            }
        }
 public FixedValidationVisitor(
     ActionContext actionContext,
     IModelValidatorProvider validatorProvider,
     ValidatorCache validatorCache,
     IModelMetadataProvider metadataProvider,
     ValidationStateDictionary validationState)
     : base(actionContext, validatorProvider, validatorCache, metadataProvider, validationState)
 {
 }
Exemple #19
0
        /// <summary>
        /// Adds an <see cref="IModelValidatorProvider"/> to <paramref name="descriptors"/>.
        /// </summary>
        /// <param name="descriptors">A list of <see cref="ModelValidatorProviderDescriptor"/>.</param>
        /// <param name="modelValidatorProvider">An <see cref="IModelValidatorProvider"/> instance.</param>
        /// <returns>A <see cref="ModelValidatorProviderDescriptor"/> representing the added instance.</returns>
        public static ModelValidatorProviderDescriptor Add(
            [NotNull] this IList <ModelValidatorProviderDescriptor> descriptors,
            [NotNull] IModelValidatorProvider modelValidatorProvider)
        {
            var descriptor = new ModelValidatorProviderDescriptor(modelValidatorProvider);

            descriptors.Add(descriptor);
            return(descriptor);
        }
        // Creates a provider with all the defaults - includes data annotations
        public static IModelValidatorProvider CreateDefaultProvider()
        {
            var providers = new IModelValidatorProvider[]
            {
                new DefaultModelValidatorProvider(),
                new DataAnnotationsModelValidatorProvider(),
            };

            return new TestModelValidatorProvider(providers);
        }
 public CustomValidationVisitor(ActionContext actionContext, IModelValidatorProvider validatorProvider, ValidatorCache validatorCache, IModelMetadataProvider metadataProvider, ValidationStateDictionary validationState, IValidatorFactory validatorFactory, CustomizeValidatorAttribute cutomizations) : base(actionContext, validatorProvider, validatorCache, metadataProvider, validationState)
 {
     _modelState        = actionContext.ModelState;
     _validatorCache    = validatorCache;
     _metadataProvider  = metadataProvider;
     _validatorFactory  = validatorFactory;
     _cutomizations     = cutomizations;
     _actionContext     = actionContext;
     _validatorProvider = validatorProvider;
 }
        // Creates a provider with all the defaults - includes data annotations
        public static IModelValidatorProvider CreateDefaultProvider()
        {
            var providers = new IModelValidatorProvider[]
            {
                new DefaultModelValidatorProvider(),
                new DataAnnotationsModelValidatorProvider(),
            };

            return(new TestModelValidatorProvider(providers));
        }
Exemple #23
0
        private IList <IModelValidator> GetValidators(IModelValidatorProvider provider, ModelMetadata metadata)
        {
            var validatorProviderContext = new ModelValidatorProviderContext(metadata);

            provider.GetValidators(validatorProviderContext);

            return(validatorProviderContext
                   .Validators
                   .OrderBy(v => v, ValidatorOrderComparer.Instance)
                   .ToList());
        }
Exemple #24
0
 /// <summary>
 /// Initializes a new instance of <see cref="ParameterBinder"/>.
 /// </summary>
 /// <param name="modelMetadataProvider">The <see cref="IModelMetadataProvider"/>.</param>
 /// <param name="modelBinderFactory">The <see cref="IModelBinderFactory"/>.</param>
 /// <param name="validatorProvider">The <see cref="IModelValidatorProvider"/>.</param>
 public ParameterBinder(
     IModelMetadataProvider modelMetadataProvider,
     IModelBinderFactory modelBinderFactory,
     IModelValidatorProvider validatorProvider)
     : this(modelMetadataProvider, modelBinderFactory, validatorProvider, null)
 {
     if (validatorProvider == null)
     {
         throw new ArgumentNullException(nameof(validatorProvider));
     }
 }
Exemple #25
0
 public ModelValidationContext(
     BindingSource bindingSource,
     [NotNull] IModelValidatorProvider validatorProvider,
     [NotNull] ModelStateDictionary modelState,
     [NotNull] ModelExplorer modelExplorer)
 {
     ModelState        = modelState;
     ValidatorProvider = validatorProvider;
     ModelExplorer     = modelExplorer;
     BindingSource     = bindingSource;
 }
Exemple #26
0
 public ParameterBinder(
     IModelMetadataProvider modelMetadataProvider,
     IModelBinderFactory modelBinderFactory,
     IModelValidatorProvider validatorProvider)
     : this(
         modelMetadataProvider,
         modelBinderFactory,
         validatorProvider,
         validatorForBackCompatOnly : null,
         loggerFactory : NullLoggerFactory.Instance)
 {
 }
        // Creates a provider with all the defaults - includes data annotations
        public static IModelValidatorProvider CreateDefaultProvider()
        {
            var providers = new IModelValidatorProvider[]
            {
                new DefaultModelValidatorProvider(),
                new DataAnnotationsModelValidatorProvider(
                    new TestOptionsManager <MvcDataAnnotationsLocalizationOptions>(),
                    stringLocalizerFactory: null),
            };

            return(new TestModelValidatorProvider(providers));
        }
        // Creates a provider with all the defaults - includes data annotations
        public static IModelValidatorProvider CreateDefaultProvider()
        {
            var providers = new IModelValidatorProvider[]
            {
                new DefaultModelValidatorProvider(),
                new DataAnnotationsModelValidatorProvider(
                    new TestOptionsManager<MvcDataAnnotationsLocalizationOptions>(),
                    stringLocalizerFactory: null),
            };

            return new TestModelValidatorProvider(providers);
        }
 public ModelValidationContext([NotNull] IModelMetadataProvider metadataProvider,
                               [NotNull] IModelValidatorProvider validatorProvider,
                               [NotNull] ModelStateDictionary modelState,
                               [NotNull] ModelMetadata metadata,
                               ModelMetadata containerMetadata)
 {
     ModelMetadata     = metadata;
     ModelState        = modelState;
     MetadataProvider  = metadataProvider;
     ValidatorProvider = validatorProvider;
     ContainerMetadata = containerMetadata;
 }
        // Creates a provider with all the defaults - includes data annotations
        public static CompositeModelValidatorProvider CreateDefaultProvider()
        {
            var providers = new IModelValidatorProvider[]
            {
                new DefaultModelValidatorProvider(),
                new DataAnnotationsModelValidatorProvider(
                    new ValidationAttributeAdapterProvider(),
                    Options.Create(new MvcDataAnnotationsLocalizationOptions()),
                    stringLocalizerFactory: null)
            };

            return(new TestModelValidatorProvider(providers));
        }
 public ModelValidationContext([NotNull] IModelMetadataProvider metadataProvider,
                               [NotNull] IModelValidatorProvider validatorProvider,
                               [NotNull] ModelStateDictionary modelState,
                               [NotNull] ModelMetadata metadata,
                               ModelMetadata containerMetadata)
     : this(metadataProvider,
            validatorProvider,
            modelState,
            metadata,
            containerMetadata,
            excludeFromValidationFilters : null)
 {
 }
Exemple #32
0
 /// <summary>
 /// Gets a <see cref="ValidationVisitor"/> that traverses the object model graph and performs validation.
 /// </summary>
 /// <param name="actionContext">The <see cref="ActionContext"/>.</param>
 /// <param name="validatorProvider">The <see cref="IModelValidatorProvider"/>.</param>
 /// <param name="validatorCache">The <see cref="ValidatorCache"/>.</param>
 /// <param name="metadataProvider">The <see cref="IModelMetadataProvider"/>.</param>
 /// <param name="validationState">The <see cref="ValidationStateDictionary"/>.</param>
 /// <returns>A <see cref="ValidationVisitor"/> which traverses the object model graph.</returns>
 public ValidationVisitor GetValidationVisitor(
     ActionContext actionContext,
     IModelValidatorProvider validatorProvider,
     ValidatorCache validatorCache,
     IModelMetadataProvider metadataProvider,
     ValidationStateDictionary validationState)
 {
     return(new SignumValidationVisitor(
                actionContext,
                validatorProvider,
                validatorCache,
                metadataProvider,
                validationState));
 }
Exemple #33
0
        public ObjectModelValidator(
            IModelMetadataProvider modelMetadataProvider,
            IList <IModelValidatorProvider> validatorProviders)
        {
            if (validatorProviders == null)
            {
                throw new ArgumentNullException(nameof(validatorProviders));
            }

            this.modelMetadataProvider = modelMetadataProvider ?? throw new ArgumentNullException(nameof(modelMetadataProvider));
            this.validatorCache        = new ValidatorCache();

            this.validatorProvider = new CompositeModelValidatorProvider(validatorProviders);
        }
        private static ModelValidationContext CreateContext(ModelMetadata metadata = null)
        {
            var providers = new IModelValidatorProvider[]
            {
                new DataAnnotationsModelValidatorProvider(),
                new DataMemberModelValidatorProvider()
            };

            return(new ModelValidationContext(new EmptyModelMetadataProvider(),
                                              providers,
                                              new ModelStateDictionary(),
                                              metadata,
                                              null));
        }
Exemple #35
0
        /// <summary>
        /// Initializes a new instance of <see cref="DefaultObjectValidator"/>.
        /// </summary>
        /// <param name="modelMetadataProvider">The <see cref="IModelMetadataProvider"/>.</param>
        /// <param name="validatorProviders">The list of <see cref="IModelValidatorProvider"/>.</param>
        public DefaultObjectValidator(
            IModelMetadataProvider modelMetadataProvider,
            IList<IModelValidatorProvider> validatorProviders)
        {
            if (modelMetadataProvider == null)
            {
                throw new ArgumentNullException(nameof(modelMetadataProvider));
            }

            if (validatorProviders == null)
            {
                throw new ArgumentNullException(nameof(validatorProviders));
            }

            _modelMetadataProvider = modelMetadataProvider;
            _validatorCache = new ValidatorCache();

            _validatorProvider = new CompositeModelValidatorProvider(validatorProviders);
        }
Exemple #36
0
        public IReadOnlyList<IModelValidator> GetValidators(ModelMetadata metadata, IModelValidatorProvider validatorProvider)
        {
            CacheEntry entry;
            if (_cacheEntries.TryGetValue(metadata, out entry))
            {
                return GetValidatorsFromEntry(entry, metadata, validatorProvider);
            }

            var items = new List<ValidatorItem>(metadata.ValidatorMetadata.Count);
            for (var i = 0; i < metadata.ValidatorMetadata.Count; i++)
            {
                items.Add(new ValidatorItem(metadata.ValidatorMetadata[i]));
            }

            ExecuteProvider(validatorProvider, metadata, items);

            var validators = ExtractValidators(items);

            var allValidatorsCached = true;
            for (var i = 0; i < items.Count; i++)
            {
                var item = items[i];
                if (!item.IsReusable)
                {
                    item.Validator = null;
                    allValidatorsCached = false;
                }
            }

            if (allValidatorsCached)
            {
                entry = new CacheEntry(validators);
            }
            else
            {
                entry = new CacheEntry(items);
            }

            _cacheEntries.TryAdd(metadata, entry);

            return validators;
        }
        /// <summary>
        /// Creates a new <see cref="ValidationVisitor"/>.
        /// </summary>
        /// <param name="actionContext">The <see cref="ActionContext"/> associated with the current request.</param>
        /// <param name="validatorProvider">The <see cref="IModelValidatorProvider"/>.</param>
        /// <param name="validationState">The <see cref="ValidationStateDictionary"/>.</param>
        public ValidationVisitor(
            ActionContext actionContext,
            IModelValidatorProvider validatorProvider,
            IModelMetadataProvider metadataProvider,
            ValidationStateDictionary validationState)
        {
            if (actionContext == null)
            {
                throw new ArgumentNullException(nameof(actionContext));
            }

            if (validatorProvider == null)
            {
                throw new ArgumentNullException(nameof(validatorProvider));
            }

            _actionContext = actionContext;
            _validatorProvider = validatorProvider;
            _metadataProvider = metadataProvider;
            _validationState = validationState;

            _modelState = actionContext.ModelState;
            _currentPath = new HashSet<object>(ReferenceEqualityComparer.Instance);
        }
Exemple #38
0
        private static ModelValidationContext CreateContext(ModelMetadata metadata = null)
        {
            var providers = new IModelValidatorProvider[]
            {
                new DataAnnotationsModelValidatorProvider(),
                new DataMemberModelValidatorProvider()
            };

            return new ModelValidationContext(new EmptyModelMetadataProvider(),
                                              providers,
                                              new ModelStateDictionary(),
                                              metadata,
                                              null);
        }
 private static ModelBindingContext CreateBindingContext(IModelBinder binder,
                                                         IValueProvider valueProvider,
                                                         Type type,
                                                         IModelValidatorProvider validatorProvider = null)
 {
     validatorProvider = validatorProvider ?? GetValidatorProvider();
     var metadataProvider = TestModelMetadataProvider.CreateDefaultProvider();
     var bindingContext = new ModelBindingContext
     {
         FallbackToEmptyPrefix = true,
         ModelMetadata = metadataProvider.GetMetadataForType(type),
         ModelState = new ModelStateDictionary(),
         ValueProvider = valueProvider,
         OperationBindingContext = new OperationBindingContext
         {
             MetadataProvider = metadataProvider,
             ModelBinder = binder,
             ValidatorProvider = validatorProvider
         }
     };
     return bindingContext;
 }
Exemple #40
0
        private IReadOnlyList<IModelValidator> GetValidatorsFromEntry(CacheEntry entry, ModelMetadata metadata, IModelValidatorProvider validationProvider)
        {
            Debug.Assert(entry.Validators != null || entry.Items != null);

            if (entry.Validators != null)
            {
                return entry.Validators;
            }

            var items = new List<ValidatorItem>(entry.Items.Count);
            for (var i = 0; i < entry.Items.Count; i++)
            {
                var item = entry.Items[i];
                if (item.IsReusable)
                {
                    items.Add(item);
                }
                else
                {
                    items.Add(new ValidatorItem(item.ValidatorMetadata));
                }
            }

            ExecuteProvider(validationProvider, metadata, items);

            return ExtractValidators(items);
        }
Exemple #41
0
 private void ExecuteProvider(IModelValidatorProvider validatorProvider, ModelMetadata metadata, List<ValidatorItem> items)
 {
     var context = new ModelValidatorProviderContext(metadata, items);
     validatorProvider.CreateValidators(context);
 }