Комментарий Джимми по этому вопросу позволил мне решить эту проблему для себя.
В моем случае я определенно добавил дополнительного провайдера к 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;