public virtual void CreateValidators(ModelValidatorProviderContext context)
 {
     context.Results.Add(new ValidatorItem {
         IsReusable = false,
         Validator  = new FluentValidationModelValidator(_implicitValidationEnabled)
     });
 }
 public void GetValidators(ModelValidatorProviderContext context)
 {
     if (context.ModelMetadata.ModelType == typeof(MyModel))
     {
         context.Validators.Add(ServiceProvider.GetService <MyModelValidator>());
     }
 }
コード例 #3
0
        public void CreateValidators(ModelValidatorProviderContext context)
        {
            for (var i = 0; i < context.Results.Count; i++)
            {
                var validatorItem = context.Results[i];
                if (validatorItem.Validator != null)
                {
                    continue;
                }

                var attribute = validatorItem.ValidatorMetadata as ValidationAttribute;
                if (attribute == null)
                {
                    continue;
                }

                var validator = new DataAnnotationsModelValidator(
                    new ValidationAttributeAdapterProvider(),
                    attribute,
                    stringLocalizer: null);

                validatorItem.Validator = validator;

                if (attribute is RequiredAttribute)
                {
                    validatorItem.IsReusable = true;
                }
            }
        }
コード例 #4
0
        /// <inheritdoc />
        public IEnumerable <ModelClientValidationRule> GetClientValidationRules(
            [NotNull] ViewContext viewContext,
            ModelExplorer modelExplorer,
            string expression)
        {
            var validatorProvider = _bindingContextAccessor.Value.ValidatorProvider;

            modelExplorer = modelExplorer ??
                            ExpressionMetadataProvider.FromStringExpression(expression, viewContext.ViewData, _metadataProvider);
            var validationContext = new ClientModelValidationContext(
                modelExplorer.Metadata,
                _metadataProvider,
                viewContext.HttpContext.RequestServices);

            var validatorProviderContext = new ModelValidatorProviderContext(modelExplorer.Metadata);

            validatorProvider.GetValidators(validatorProviderContext);

            var validators = validatorProviderContext.Validators;

            return
                (validators
                 .OfType <IClientModelValidator>()
                 .SelectMany(v => v.GetClientValidationRules(validationContext)));
        }
コード例 #5
0
 public void CreateValidators(ModelValidatorProviderContext context)
 {
     // Perf: Avoid allocations
     for (var i = 0; i < ValidatorProviders.Count; i++)
     {
         ValidatorProviders[i].CreateValidators(context);
     }
 }
 protected virtual IValidator CreateValidator(ModelValidatorProviderContext context)
 {
     if (IsValidatingProperty(context))
     {
         return(ValidatorFactory.GetValidator(context.ModelMetadata.ContainerType));
     }
     return(ValidatorFactory.GetValidator(context.ModelMetadata.ModelType));
 }
        public void GetValidators(ModelValidatorProviderContext context)
        {
            IValidator validator = CreateValidator(context);

            if (!IsValidatingProperty(context))
            {
                context.Validators.Add(new FluentValidationModelValidator(validator));
            }
        }
コード例 #8
0
        public void GetValidators(ModelValidatorProviderContext context)
        {
            var modelType = context.ModelMetadata.ModelType;

            if (typeof(EntitySelector).IsAssignableFrom(modelType))
            {
                context.Validators.Add(Validator);
            }
        }
コード例 #10
0
        protected ModelValidatorProviderContext GetMockedContext()
        {
            var options  = _provider.GetRequiredService <IOptions <MvcOptions> >();
            var provider = new DefaultModelMetadataProvider(_compositeMetadataDetailsProvider, options);
            var metadata = provider.GetMetadataForType(typeof(ValidatableObject));

            var context = new ModelValidatorProviderContext(metadata, GetValidatorItems(metadata));

            return(context);
        }
コード例 #11
0
 /// <summary>
 /// Attaches the validator if there is none yet present and the
 /// parameter is assignable to an <see cref="IFormFile"/>
 /// </summary>
 /// <param name="context"></param>
 public void CreateValidators(ModelValidatorProviderContext context)
 {
     if (typeof(IFormFile).IsAssignableFrom(context.ModelMetadata.ModelType))
     {
         context.Results.Add(new ValidatorItem
         {
             IsReusable = true,
             Validator  = new EmptyFormFileValidator()
         });
     }
 }
コード例 #12
0
 public void CreateValidators(ModelValidatorProviderContext context)
 {
     if (context.ModelMetadata.ContainerType == typeof(User))
     {
         context.Results.Add(new ValidatorItem
         {
             Validator  = new UserModelValidator(),
             IsReusable = true
         });
     }
 }
 public void CreateValidators(ModelValidatorProviderContext context)
 {
     // Note that this check does NOT catch complex types that are collection elements (as the ModelMetadataKind will still be 'Type')
     if (context.ModelMetadata.MetadataKind == ModelMetadataKind.Type || context.ModelMetadata.MetadataKind == ModelMetadataKind.Parameter || (context.ModelMetadata.MetadataKind == ModelMetadataKind.Property && _implicitValidationEnabled))
     {
         context.Results.Add(new ValidatorItem {
             IsReusable = false,
             Validator  = new FluentValidationModelValidator()
         });
     }
 }
コード例 #14
0
 /// <inheritdoc />
 public void GetValidators(ModelValidatorProviderContext context)
 {
     foreach (var metadata in context.ValidatorMetadata)
     {
         var validator = metadata as IModelValidator;
         if (validator != null)
         {
             context.Validators.Add(validator);
         }
     }
 }
コード例 #15
0
        public void CreateValidators(ModelValidatorProviderContext context)
        {
            IStringLocalizer stringLocalizer = null;

            if (_stringLocalizerFactory != null && _options.Value.DataAnnotationLocalizerProvider != null)
            {
                stringLocalizer = _options.Value.DataAnnotationLocalizerProvider(
                    context.ModelMetadata.ContainerType ?? context.ModelMetadata.ModelType,
                    _stringLocalizerFactory);
            }

            var results = context.Results;
            // Read interface .Count once rather than per iteration
            var resultsCount = results.Count;

            for (var i = 0; i < resultsCount; i++)
            {
                var validatorItem = results[i];
                if (validatorItem.Validator != null)
                {
                    continue;
                }

                if (!(validatorItem.ValidatorMetadata is ValidationAttribute attribute))
                {
                    continue;
                }

                var validator = new DataAnnotationsModelValidator(
                    _validationAttributeAdapterProvider,
                    attribute,
                    stringLocalizer);

                validatorItem.Validator  = validator;
                validatorItem.IsReusable = true;
                // Inserts validators based on whether or not they are 'required'. We want to run
                // 'required' validators first so that we get the best possible error message.
                if (attribute is RequiredAttribute)
                {
                    context.Results.Remove(validatorItem);
                    context.Results.Insert(0, validatorItem);
                }
            }

            // Produce a validator if the type supports IValidatableObject
            if (typeof(IValidatableObject).IsAssignableFrom(context.ModelMetadata.ModelType))
            {
                context.Results.Add(new ValidatorItem
                {
                    Validator  = new ValidatableObjectAdapter(),
                    IsReusable = true
                });
            }
        }
コード例 #16
0
 public void CreateValidators(ModelValidatorProviderContext context)
 {
     if (context.ModelMetadata.IsEnum || context.ModelMetadata.IsNullableValueType)
     {
         context.Results.Add(new ValidatorItem
         {
             Validator  = new EnumRangeValidator(),
             IsReusable = true
         });
     }
 }
コード例 #17
0
 /// <inheritdoc />
 public void GetValidators(ModelValidatorProviderContext context)
 {
     foreach (var metadata in context.ValidatorMetadata)
     {
         var validator = metadata as IModelValidator;
         if (validator != null)
         {
             context.Validators.Add(validator);
         }
     }
 }
        /// <summary>
        /// Creates the server validation validators
        /// </summary>
        /// <param name="context"></param>
        public void CreateValidators(ModelValidatorProviderContext context)
        {
            bool shouldAddRequiredValidator = !(context.Results.Any(x => x.GetType().Equals(typeof(RequiredAttributeAdapter))));

            foreach (var validator in GetValidators(context.ModelMetadata, shouldAddRequiredValidator))
            {
                var validatorItem = new ValidatorItem();
                validatorItem.Validator  = validator;
                validatorItem.IsReusable = false;
                context.Results.Add(validatorItem);
            }
        }
        public void CreateValidators(ModelValidatorProviderContext context)
        {
            var validator = CreateValidator(context);

            if (!IsValidatingProperty(context) && validator != null)
            {
                context.Results.Add(new ValidatorItem {
                    Validator  = new FluentValidationModelValidator(validator),
                    IsReusable = false
                });
            }
        }
コード例 #20
0
        /// <summary>
        /// 创建验证器。
        /// </summary>
        /// <param name="context"></param>
        public void CreateValidators(ModelValidatorProviderContext context)
        {
            context.Results?.ForEach(validatorItem =>
            {
                if (validatorItem.Validator is null || !(validatorItem.ValidatorMetadata is ValidationAttribute attribute))
                {
                    return;
                }

                validatorItem.Validator = new DataAnnotationsModelValidator(validatorItem.Validator, attribute);
            });
        }
コード例 #21
0
        public void CreateValidators(ModelValidatorProviderContext context)
        {
            var validator = GetValidator(context.ModelMetadata.ModelType);

            if (validator != null)
            {
                context.Results.Add(new ValidatorItem()
                {
                    Validator = new ValidationModelValidator(validator)
                });
            }
        }
コード例 #22
0
 /// <inheritdoc />
 public void GetValidators(ModelValidatorProviderContext context)
 {
     //Perf: Avoid allocations here
     for (var i = 0; i < context.ValidatorMetadata.Count; i++)
     {
         var validator = context.ValidatorMetadata[i] as IModelValidator;
         if (validator != null)
         {
             context.Validators.Add(validator);
         }
     }
 }
コード例 #23
0
        internal static PropertyValidationInfo GetPropertyValidationInfo(ModelBindingContext bindingContext)
        {
            var validationInfo = new PropertyValidationInfo();
            var modelTypeInfo  = bindingContext.ModelType.GetTypeInfo();
            var typeAttribute  = modelTypeInfo.GetCustomAttribute <BindingBehaviorAttribute>();
            var properties     = bindingContext.ModelType.GetProperties(BindingFlags.Public | BindingFlags.Instance);

            foreach (var property in properties)
            {
                var propertyName     = property.Name;
                var propertyMetadata = bindingContext.ModelMetadata.Properties[propertyName];
                if (propertyMetadata == null)
                {
                    // Skip indexer properties and others ModelMetadata ignores.
                    continue;
                }

                var validatorProviderContext = new ModelValidatorProviderContext(propertyMetadata);
                bindingContext.OperationBindingContext.ValidatorProvider.GetValidators(validatorProviderContext);

                var requiredValidator = validatorProviderContext.Validators
                                        .FirstOrDefault(v => v != null && v.IsRequired);
                if (requiredValidator != null)
                {
                    validationInfo.RequiredValidators[propertyName] = requiredValidator;
                }

                var propertyAttribute        = property.GetCustomAttribute <BindingBehaviorAttribute>();
                var bindingBehaviorAttribute = propertyAttribute ?? typeAttribute;
                if (bindingBehaviorAttribute != null)
                {
                    switch (bindingBehaviorAttribute.Behavior)
                    {
                    case BindingBehavior.Required:
                        validationInfo.RequiredProperties.Add(propertyName);
                        break;

                    case BindingBehavior.Never:
                        validationInfo.SkipProperties.Add(propertyName);
                        break;
                    }
                }
                else if (requiredValidator != null)
                {
                    validationInfo.RequiredProperties.Add(propertyName);
                }
            }

            return(validationInfo);
        }
コード例 #24
0
        public void CreateValidators(ModelValidatorProviderContext context)
        {
            if (context.ModelMetadata.MetadataKind == ModelMetadataKind.Type)
            {
                var item = new ValidatorItem
                {
                    Validator  = new Valitator(_factory),
                    IsReusable = true,
                };

                context.Results.Add(item);
            }
            var test = context;
            //throw new System.NotImplementedException();
        }
コード例 #25
0
        /// <inheritdoc/>
        public void CreateValidators(ModelValidatorProviderContext context)
        {
            var modelMetadata = context.ModelMetadata;
            var modelType     = modelMetadata.ModelType;

            if (modelType.IsDataSet())
            {
                if (!context.Results.Any(x => x.Validator.GetType() == typeof(DataSetValidator)))
                {
                    context.Results.Add(new ValidatorItem
                    {
                        Validator  = new DataSetValidator(),
                        IsReusable = true
                    });
                }
            }
        }
コード例 #26
0
        public void CreateValidators(ModelValidatorProviderContext context)
        {
            var stringLocalizerAdapter =
                _stringLocalizerFactory != null && _dataAnnotationLocalizerProvider != null && context.ModelMetadata.ModelType.HasInterface(typeof(IValidatableObject)) ?
                new StringLocalizerAdapter(_dataAnnotationLocalizerProvider(context.ModelMetadata.ContainerType ?? context.ModelMetadata.ModelType, _stringLocalizerFactory)) :
                null;

            var validatableObjectAdapterFound = false;

            var results = context.Results;

            for (int i = 0, n = results.Count; i < n; i++)
            {
                var result = results[i];

                // 1. default messages of built-in validation attributes aren't localized by default (https://github.com/aspnet/Localization/issues/286);
                // the least cumbersome solution to this problem is setting the ErrorMessage property, which will ensure that the message will run through the localizer

                if (result.ValidatorMetadata is ValidationAttribute validationAttribute)
                {
                    validationAttribute.AdjustToMvcLocalization();
                }

                // 2. support for ExtendedValidationResult localization in the case of IValidatableObject

                if (stringLocalizerAdapter != null)
                {
                    // we need to check type by name because unfortunately ValidatableObjectAdapter is internal
                    if (result.Validator != null && result.Validator.GetType().FullName == "Microsoft.AspNetCore.Mvc.DataAnnotations.ValidatableObjectAdapter")
                    {
                        results[i] = new ValidatorItem(result.ValidatorMetadata)
                        {
                            Validator  = new CustomValidatableObjectAdapter(_validationAttributeAdapterProvider, stringLocalizerAdapter),
                            IsReusable = result.IsReusable,
                        };

                        validatableObjectAdapterFound = true;
                    }
                }
            }

            if (stringLocalizerAdapter != null)
            {
                Debug.Assert(validatableObjectAdapterFound, "Microsoft.AspNetCore.Mvc.DataAnnotations internals have apparently changed.");
            }
        }
コード例 #27
0
 public void CreateValidators(ModelValidatorProviderContext context)
 {
     //1、只要存在IsReusable为false的那就会每次启动调用所有的IModelValidatorProvider的CreateValidators方法
     //2、因为我们初始化rule的时候默认IsReusable的值是false,Validator也是空的,好在这个初始化之后会调用一把我们的CreateValidator方法,
     //   所以我们有必要在CreateValidator中将其置为true,并把Validator的值给赋上
     //3、如果我们只是添加一个新的可复用的Validator,那由于第一次会将其缓存起来,导致第二次之后都会有两个重复的Validator
     //4、具体细节在ValidatorCache类中
     foreach (var item in context.Results)
     {
         if (item.Validator == null)
         {
             var validateRule = item.ValidatorMetadata as IValidationRule;
             if (validateRule != null)
             {
                 item.Validator  = new FluentValidationModelValidator(validateRule);
                 item.IsReusable = true;
             }
         }
     }
     //foreach (var rule in context.ValidatorMetadata.OfType<IValidationRule>())
     //{
     //    //if (!hasRequiredAttribute)
     //    //{
     //    //    foreach (var val in rule.Validators)
     //    //    {
     //    //        hasRequiredAttribute |= (val is NotNullValidator);
     //    //        hasRequiredAttribute |= (val is NotEmptyValidator);
     //    //    }
     //    //}
     //    //context.Results.Add(new ValidatorItem(rule)
     //    //{
     //    //    Validator = new FluentValidationModelValidator(rule),
     //    //    IsReusable = true
     //    //});
     //    //移除 Mvc 自动添加的 Required 验证器。
     //    //if (hasRequiredAttribute && context.ModelMetadata.IsRequired)
     //    //{
     //    //    RequiredAttributeAdapter adatper = context.Validators.OfType<RequiredAttribute>().FirstOrDefault();
     //    //    if (adatper != null)
     //    //    {
     //    //        context.Validators.Remove(adatper);
     //    //    }
     //    //}
     //}
 }
コード例 #28
0
        public void IValidatableObjectGetsAValidator()
        {
            // Arrange
            var provider = new DataAnnotationsModelValidatorProvider(
                new ValidationAttributeAdapterProvider(),
                Options.Create(new MvcDataAnnotationsLocalizationOptions()),
                stringLocalizerFactory: null);
            var mockValidatable = new Mock <IValidatableObject>();
            var metadata        = _metadataProvider.GetMetadataForType(mockValidatable.Object.GetType());

            var providerContext = new ModelValidatorProviderContext(metadata, GetValidatorItems(metadata));

            // Act
            provider.CreateValidators(providerContext);

            // Assert
            Assert.Single(providerContext.Results);
        }
コード例 #29
0
        public void CreateValidators_ReturnsValidatorForDataSetType()
        {
            // Arrange
            var provider = new DataSetValidatorProvider();
            var dataSet  = DataSet <Person> .Create();

            var metadata = _metadataProvider.GetMetadataForType(dataSet.GetType());

            var providerContext = new ModelValidatorProviderContext(metadata, GetValidatorItems(metadata));

            // Act
            provider.CreateValidators(providerContext);

            // Assert
            var validatorItem = Assert.Single(providerContext.Results);

            Assert.IsType <DataSetValidator>(validatorItem.Validator);
        }
コード例 #30
0
        public void UnknownValidationAttributeGetsDefaultAdapter()
        {
            // Arrange
            var provider = new DataAnnotationsModelValidatorProvider(
                new ValidationAttributeAdapterProvider(),
                Options.Create(new MvcDataAnnotationsLocalizationOptions()),
                stringLocalizerFactory: null);
            var metadata = _metadataProvider.GetMetadataForType(typeof(DummyClassWithDummyValidationAttribute));

            var providerContext = new ModelValidatorProviderContext(metadata, GetValidatorItems(metadata));

            // Act
            provider.CreateValidators(providerContext);

            // Assert
            var validatorItem = providerContext.Results.Single();

            Assert.IsType <DataAnnotationsModelValidator>(validatorItem.Validator);
        }
コード例 #31
0
    public void CreateValidators_ModelValidatorAttributeOnClass()
    {
        // Arrange
        var metadataProvider  = TestModelMetadataProvider.CreateDefaultProvider();
        var validatorProvider = TestModelValidatorProvider.CreateDefaultProvider();

        var metadata = metadataProvider.GetMetadataForType(typeof(ModelValidatorAttributeOnClass));
        var context  = new ModelValidatorProviderContext(metadata, GetValidatorItems(metadata));

        // Act
        validatorProvider.CreateValidators(context);

        // Assert
        var validatorItems = context.Results;

        var validator = Assert.IsType <CustomModelValidatorAttribute>(Assert.Single(validatorItems).Validator);

        Assert.Equal("Class", validator.Tag);
    }