2013-10-09 4 views
1

Я использую asp.net web api, и я не знаю, что я делаю что-то не так, но мне почему-то гораздо труднее использовать DataAnnotations для проверки с помощью WebApi vs MVC.Проверка для WebApi?

Например, если я хочу использовать обязательный валидатор для не строки, я должен использовать DataContract с IsRequired, что я нахожу, добавляет к беспорядку.

Я также обнаружил, что если аннотация данных не может подтвердить, что я действительно не получаю ошибку (RestSharp считает, что все хорошо).

Мне интересно, что люди используют ничего, кроме DataAnnotations, с помощью WebApi? Я знаю, что в MVC существует Fluent Validation для .net, но не уверен, что это работает с WebApi.

Редактировать

Я немного запутался базы по ссылке в комментариях.

В первой части они имеют это


if (ModelState.IsValid) 
{ 
    // Do something with the product (not shown). 

    return new HttpResponseMessage(HttpStatusCode.OK); 
} 
else 
{ 
    return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState); 
} 

Я думал Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState); будет посылать все модели состояния ошибки обратно.

Но тогда она идет

обработки проверки ОШИБКИ

Web API автоматически не возвращает ошибку клиенту при проверка не пройдена. Это зависит от действия контроллера, чтобы проверить состояние модели и отреагировать соответствующим образом.

Я смущен этой строкой, так как, как я уже сказал, я думал, что CreateErrorResponse обрабатывал это.

+0

Извините, если я ошибаюсь, но я нахожу эту ссылку полезной: http://www.asp.net/web-api/overview/formats-and-model-binding/model-validation-in-aspnet- web-api – Vladimir

+0

@VladimirFrolov - Спасибо, что очень полезно, но я немного запутался в некоторых вещах. Я закончу ОП. – chobo2

+0

О обработке ошибок проверки: в учебнике предлагается два способа. Первый, как вы сказали, является 'Request.CreateErrorResponse' внутри контроллера.Во-вторых, применить атрибут фильтра к контроллеру или использовать глобальный фильтр. И внутри фильтра похож 'actionContext.Request.CreateErrorResponse'. «Веб-API автоматически не возвращает ошибку клиенту» означает, что в конфигурации по умолчанию (т. Е. Без проверки состояния фильтра или состояния модели внутри контроллера) вы не получите информацию об ошибке проверки. – Vladimir

ответ

2

Что касается вашей проблемы с [DataContract (IsRequired = true)], есть некоторые сообщения на самой SO, описывающие, почему это было необходимо (проблемы безопасности) и почему это больше не нужно (багги). Для справки: Validation datacontract and datamember required

Все, что вам нужно сделать, чтобы полагаться только на DataAnnotation атрибуты IST удалить InvalidModelValidatorProvider из Web Api Config, например, так:

config.Services.RemoveAll(typeof(ModelValidatorProvider), (provider) => provider is InvalidModelValidatorProvider);

На самом деле вы правы, эта линия

return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState); 

отправит ваши ошибки проверки обратно клиенту. Что подразумевается в выдержке, которую вы указали, так это то, что вы должны написать эту строку либо в корпусе контроллера, либо в фильтре проверки.

Надеюсь, что это поможет.

Смежные вопросы