Имена типов проверки в ненавязчивых правилах проверки клиента должны быть уникальными - PullRequest
32 голосов
/ 17 марта 2012

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

Это относится к свойству 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?

Ответы [ 4 ]

19 голосов
/ 28 марта 2014

Комментарий Джимми по этому вопросу позволил мне решить эту проблему для себя.

В моем случае я определенно добавил дополнительного провайдера к ModelValidatorProviders. Я добавил фабрику пользовательской проверки (используя Свободная проверка ) с этим кодом в моем файле 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; 
10 голосов
/ 22 июня 2016

В моем случае у меня было

.NotEmpty()

и

.NotNull()

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

2 голосов
/ 21 сентября 2016

Если вы используете FluentValidation рядом с аннотациями данных, это может произойти.

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

FluentValidationModelValidatorProvider.Configure(); 
// Remove data annotations validation provider 
ModelValidatorProviders.Providers.Remove(
            ModelValidatorProviders.Providers.OfType<DataAnnotationsModelValidatorProvider>().First());
0 голосов
/ 08 ноября 2013

Пожалуйста, обновите файл web.config:

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