/// <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); }
/// <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)); }
/// <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); }
/// <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); }
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()); }
/// <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)); }
/// <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); }
/// <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(); }
/// <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(); }
/// <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);
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) { }
/// <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)); }
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()); }
/// <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)); } }
public ModelValidationContext( BindingSource bindingSource, [NotNull] IModelValidatorProvider validatorProvider, [NotNull] ModelStateDictionary modelState, [NotNull] ModelExplorer modelExplorer) { ModelState = modelState; ValidatorProvider = validatorProvider; ModelExplorer = modelExplorer; BindingSource = bindingSource; }
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) { }
/// <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)); }
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)); }
/// <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); }
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); }
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; }
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); }
private void ExecuteProvider(IModelValidatorProvider validatorProvider, ModelMetadata metadata, List<ValidatorItem> items) { var context = new ModelValidatorProviderContext(metadata, items); validatorProvider.CreateValidators(context); }