Подтвердить что ты не робот

Имена типов проверки в ненавязчивых правилах проверки клиента должны быть уникальными

Имена типов проверки в ненавязчивых правилах проверки клиента должны быть уникальный. Следующий тип проверки был просмотрен более одного раза: требуется

Это относится к свойству EmailAddress, здесь:

public class LoginModel
{
    [Required]
    [DataType(DataType.EmailAddress)]
    [Display(Name = "Email")]
    [AdditionalMetadata("Style", "Wide")]
    public string EmailAddress { get; set; }

    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    [AdditionalMetadata("Style", "Wide")]
    public string Password { get; set; }
}

Я не использую одно и то же правило проверки дважды. Это работает нормально локально, но не при развертывании на сервере. Какая сделка?

Я добавил ссылку на DataAnnotationExtensions (http://dataannotationsextensions.org), может ли это быть проблемой?

Изменить: удаление ссылки не устранило проблему. Кажется, что-то может быть испорчено конфигурацией IIS?

4b9b3361

Ответ 1

комментарий JimmiTh по этому вопросу предоставил мне ключевое понимание, чтобы я разрешил это для себя.

В моем случае я определенно добавил дополнительного провайдера в ModelValidatorProviders. Я добавил пользовательскую проверку factory (используя Fluent Validation) с этим кодом в файле Global.asax.cs:

ModelValidatorProviders.Providers.Add(
    new FluentValidationModelValidatorProvider(validatorFactory));

Но использование нескольких поставщиков не обязательно проблематично. То, что кажется проблематичным, заключается в том, что несколько провайдеров предоставляют одни и те же валидаторы, поскольку они будут регистрировать одни и те же правила несколько раз, вызывая указанную проблему с ненавязчивым кодом проверки Microsoft.

Я закончил удаление следующей строки из того же файла, что и я решил, что мне не нужно использовать оба поставщика:

FluentValidationModelValidatorProvider.Configure();

Приведенный выше метод Configure сам добавляет провайдера к ModelValidatorProviders, и я дважды регистрировал один и тот же класс проверки, а следовательно, и ошибку о неповторимых именах типов проверки.

Вопрос SO jquery - бесплатные проверки. Ошибка: имена типов проверки в ненавязчивых правилах проверки клиента должны быть уникальными указывает на другой способ, который может привести к указанной проблеме с использованием нескольких поставщиков. Каждому провайдеру можно настроить добавление "неявного обязательного атрибута в" типы значений "(т.е. Свойства модели просмотра, которые не могут быть обнулены). Чтобы решить эту проблему, я мог бы изменить свой код на следующие, чтобы ни один из поставщиков не добавлял неявные требуемые атрибуты:

FluentValidationModelValidatorProvider.Configure(
    provider => provider.AddImplicitRequiredValidator = false);


DependencyResolverValidatorFactory validatorFactory =
    new DependencyResolverValidatorFactory();

FluentValidationModelValidatorProvider validatorFactoryProvider =
    new FluentValidationModelValidatorProvider(validatorFactory);

validatorFactoryProvider.AddImplicitRequiredValidator = false;
ModelValidatorProviders.Providers.Add(validatorFactoryProvider);


DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false; 

Ответ 2

Мое дело было в том, что у меня был

.NotEmpty()

и

.NotNull()

в то же время требуется только один.

Ответ 3

Если вы используете FluentValidation бок о бок с DataAnnotations, это может произойти.

Когда FluentValidation находится в действии, вам может потребоваться удалить DataAnnotationsModelValidatorProvider из зарегистрированного ModelValidatorProviders в методе Application_Start.

FluentValidationModelValidatorProvider.Configure(); 
// Remove data annotations validation provider 
ModelValidatorProviders.Providers.Remove(
            ModelValidatorProviders.Providers.OfType<DataAnnotationsModelValidatorProvider>().First());

Ответ 4

Обновите файл web.config:

<configuration>
    <appSettings>
        <add key="ClientValidationEnabled" value="true"/>
        <add key="UnobtrusiveJavaScriptEnabled" value="true"/>
    </appSettings>
</configuration>