Проверка на стороне сервера с помощью пользовательских DataAnnotationsModelValidatorProvider

Я настроил собственного провайдера, чтобы разрешить установку атрибутов проверки из хранилища данных вместо статического кода. Прекрасно работает с проверкой на стороне клиента в моем проекте.NET MVC 4, но я не могу заставить работать проверку на стороне сервера.

CustomModelValidatorProvider.cs:

    открытый класс CustomModelValidatorProvider: DataAnnotationsModelValidatorProvider
    {
        защищенное переопределение IEnumerable GetValidators(метаданные ModelMetadata, контекст ControllerContext, атрибуты IEnumerable)
        {
            // установить атрибуты из хранилища данных здесь

            вернуть base.GetValidators(метаданные, контекст, атрибуты);
        }
    }

В моем Global.asax.cs у меня есть:

    защищенная пустота Application_Start()
    {
        ModelValidatorProviders.Providers.Clear();
        ModelValidatorProviders.Providers.Add(new CustomModelValidatorProvider());
    }

И в методе Web API у меня есть:

    var validationResultList = new List ();
    bool valid = Validator.TryValidateObject (myModelObject, новый ValidationContext(myModelObject, null, null), validationResultList, true);

Здесь действительное всегда верно. Даже когда проверка на стороне клиента Jquery отображает ошибку. На стороне сервера мой пользовательский поставщик не используется для применения аннотаций данных. Когда я устанавливаю точку останова в GetValidators(), она вызывается при создании представления и корректно отображает средства проверки на стороне клиента, но не вызывается снова, когда модель привязана к контроллеру.

Я пропустил шаг? Любая помощь очень ценится!

ОБНОВИТЬ

Пользовательский валидатор работает правильно, когда объект публикуется в Controller, но не запускается при публикации в ApiController.

1 ответ

Решение

Я наконец понял это, это довольно простой ответ. ApiControllers отвечают только поставщикам в пространстве имен System.Web.Http.Validation, а не в пространстве имен System.Web.Mvc, которое используется для обычных контроллеров и проверки на стороне клиента.

Я реализовал оба, чтобы добиться как проверки на стороне клиента, так и проверки сервера в ApiControllers.

Другие вопросы по тегам