Как запретить Ninject переопределять пользовательский DataAnnotationsModelValidatorProvider?

У меня есть собственный DataAnnotationsModelValidatorProvider для более динамичной проверки модели, чем просто добавление атрибутов. Я попытался добавить свое предложение в global.asax.cs следующим образом:

ModelValidatorProviders.Providers.Clear();
ModelValidatorProviders.Providers.Add(new AttributeValidatorProvider());

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

Согласно комментарий к этому блогу, это связано с тем, что Ninject переопределяет поставщиков пользовательских валидаторов.

Я довольно новичок в MVC и, похоже, не могу найти способ сказать Ninject, чтобы он также принимал моих пользовательских поставщиков, как мне решить эту проблему?

Для справки: я не хочу использовать Fluentvalidation.net, я хочу придерживаться стандартных проверок MVC (по большей части).


person sebastiaan    schedule 02.12.2011    source источник


Ответы (2)


Изменить регистрацию провайдера на

Rebind<ModelValidatorProvider>().To<AttributeValidatorProvider>();
person Remo Gloor    schedule 13.12.2011
comment
Кажется, я не могу заставить Ninject работать со встроенным DataAnnotationsModelValidatorProvider, даже при попытке Rebind, как вы упомянули. Похоже, что из коробки Ninject нарушает валидацию. Что такое по умолчанию для Ninject и как использовать встроенные аннотации данных с Ninject. Я много искал и не нашел документации, сообщений в блогах или статей с рабочим решением. - person Greg Levenhagen; 20.02.2012
comment
Взгляните на пример приложения: github.com/ninject/ninject.web.mvc/blob/master/mvc3/src/ - person Remo Gloor; 20.02.2012
comment
Спасибо! Мне не хватало загрузки исполняющей сборки; загружались только мои сервисы и модули. - person Greg Levenhagen; 01.03.2012
comment
У меня тоже есть эта проблема, но в немного других обстоятельствах, можете ли вы взглянуть на мой ответ ниже? - person AdamH; 10.04.2012

Есть еще один способ (точно работает в MVC 4):

Найдите свой класс, который наследует IdependencyResolver интерфейс и добавьте в конструктор _kernel.Unbind<ModelValidatorProvider>(); - вы просто отвязываете валидатор ninject, и не должно быть коллизии с валидатором по умолчанию.

В моем случае мой конструктор выглядит так:

public NinjectDependencyResolver()
{
       _kernel = new StandardKernel();
       _kernel.Unbind<ModelValidatorProvider>();
       AddBindings();
}
person 1_bug    schedule 19.04.2015
comment
Это решило мою проблему. Что это сделает с Ninject? - person jmdon; 18.12.2017
comment
У меня была такая же проблема с использованием ASP.NET MVC 5.2.3.0 и Ninject.Web 3.3.0, и ваше решение сработало. Спасибо! - person Jalal; 11.04.2018