1

Ситуация: Есть приложение с фронтэндом на ASP MVC 4.5.

Данные гоняются через собственное json api. Методы api - это action контроллеров.

Модель часто гоняется не полная, а только изменившиеся свойства. При приходе в контроллер она валидируется, но часто фейлится (поскольку часто приходит только изменения, а не вся она целиком).

"Правильная" валидация есть, но происходит на следующем за контроллерами уровненм.

Вопрос: как отключить валидацию MVC, которая происходит до вызова конроллера? (я про ту, которая устанавливает ModelState.IsValid)?

(не хочется валидировать каждую сущность 2 раза, один раз фейл на контроллере и один раз в собственном коде дальше)

1 ответ 1

2

Чтобы отключить валидацию в MVC, попробуйте в Global.asax.cs очистить ModelValidatorProviders:

protected void Application_Start()
{
    // Other startup code...

    ModelValidatorProviders.Providers.Clear();
}

Кстати, если посмотреть в исходники MVC 3, мы увидим там три провайдера по умолчанию:

public static class ModelValidatorProviders {

        private static readonly ModelValidatorProviderCollection _providers = new ModelValidatorProviderCollection() {
            new DataAnnotationsModelValidatorProvider(),
            new DataErrorInfoModelValidatorProvider(),
            new ClientDataTypeModelValidatorProvider()
        };

        public static ModelValidatorProviderCollection Providers {
        get {
            return _providers;
        }
    }
}

Провайдеры правил (логики) проверки Модели хорошо описывает работу этих ModelValidationProviders.

4
  • Ух ты! Спасибо за ссылку, завтра попробую и отмечу ответ если сработает. 30 июл 2012 в 19:27
  • Странно, но не работает. Убрал провайдеры, добавил туда свой, но ни GetValidators провайдера, ни Validate ModelValidator`а не вызываются, а стандартная валидация продолжает работать. 31 июл 2012 в 12:33
  • Стандартная валидация какого рода продолжает работать? Может быть это ошибки binding'а, например, неправильный формат даты или числа?
    – Tolyandre
    31 июл 2012 в 12:48
  • Срабатывают именно ошибки, связанные с аттрибутами (Required, Regex, ...), даже сообщениия получаю из них. Мой же провайдер не вызывается, хотя я его добавил в коллекцию и всю жизнь запроса он там один. 31 июл 2012 в 17:05

Ваш ответ

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge you have read our privacy policy.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками или задайте свой вопрос.