Проверка на стороне сервера с помощью пользовательских 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.