public void CreateValidators_ForInteger(Type type)
        {
            ModelMetadata metadata = new EmptyModelMetadataProvider().GetMetadataForType(type);
            ClientValidatorProviderContext context = new ClientValidatorProviderContext(metadata, new List<ClientValidatorItem>());

            new ClientValidatorProvider().CreateValidators(context);

            ClientValidatorItem actual = context.Results.Single();

            Assert.IsType<IntegerValidator>(actual.Validator);
            Assert.Null(actual.ValidatorMetadata);
            Assert.True(actual.IsReusable);
        }
        /// <summary>
        /// Creates the client validation validators
        /// </summary>
        /// <param name="context"></param>
        public void CreateValidators(ClientValidatorProviderContext context)
        {
            bool shouldAddRequiredValidator = !(context.Results.Any(x => x.GetType().Equals(typeof(RequiredAttributeAdapter))));

            foreach (var validator in GetValidators(context.ModelMetadata, false).OfType <IClientModelValidator>())
            {
                var clientValidatorItem = new ClientValidatorItem();
                clientValidatorItem.Validator  = validator;
                clientValidatorItem.IsReusable = false;

                context.Results.Add(clientValidatorItem);
            }
        }
        public void CreateValidators_DoesNotAddDuplicateValidators()
        {
            // Arrange
            var provider = new NumericClientModelValidatorProvider();
            var metadata = _metadataProvider.GetMetadataForType(typeof(float));
            var items    = GetValidatorItems(metadata);
            var expectedValidatorItem = new ClientValidatorItem
            {
                Validator  = new NumericClientModelValidator(),
                IsReusable = true
            };

            items.Add(expectedValidatorItem);

            var providerContext = new ClientValidatorProviderContext(metadata, items);

            // Act
            provider.CreateValidators(providerContext);

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

            Assert.Same(expectedValidatorItem.Validator, validatorItem.Validator);
        }
コード例 #4
0
        /// <inheritdoc />
        public void CreateValidators(ClientValidatorProviderContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }
            IStringLocalizer stringLocalizer = null;

            if (_options.Value.DataAnnotationLocalizerProvider != null && _stringLocalizerFactory != null)
            {
                // This will pass first non-null type (either containerType or modelType) to delegate.
                // Pass the root model type(container type) if it is non null, else pass the model type.
                stringLocalizer = _options.Value.DataAnnotationLocalizerProvider(
                    context.ModelMetadata.ContainerType ?? context.ModelMetadata.ModelType,
                    _stringLocalizerFactory);
            }

            var hasRequiredAttribute = false;
            var metadata             = context.ModelMetadata;
            var isPropertyValidation = metadata.ContainerType != null && !String.IsNullOrEmpty(metadata.PropertyName);
            var rules = ValidationManager.GetValidationRules(metadata.ContainerType, metadata.PropertyName);

            if (rules == null)
            {
                return;
            }
            foreach (var rule in rules)
            {
                var validationAttribute = rule.CreateValidationAttribute();
                if (validationAttribute == null)
                {
                    continue;
                }
                var validatorItem = new ClientValidatorItem(validationAttribute);
                if (validatorItem.Validator != null)
                {
                    // Check if a required attribute is already cached.
                    hasRequiredAttribute |= validatorItem.Validator is RequiredAttributeAdapter;
                    continue;
                }
                hasRequiredAttribute |= validationAttribute is RequiredAttribute;
                var adapter = _validationAttributeAdapterProvider.GetAttributeAdapter(validationAttribute, stringLocalizer);
                if (adapter != null)
                {
                    validatorItem.Validator  = adapter;
                    validatorItem.IsReusable = true;
                }
                context.Results.Add(validatorItem);
            }

            if (!hasRequiredAttribute && context.ModelMetadata.IsRequired)
            {
                // Add a default '[Required]' validator for generating HTML if necessary.
                context.Results.Add(new ClientValidatorItem
                {
                    Validator = _validationAttributeAdapterProvider.GetAttributeAdapter(
                        new RequiredAttribute(),
                        stringLocalizer),
                    IsReusable = true
                });
            }
        }