Правильная работа с валидациями и их тестирование существует на всех разных уровнях приложения, от валидации на уровне браузера до ограничений SQL, и если вы не используете правильный способ обработки валидаций, вы получите множество код, который выйдет из-под контроля и его будет трудно отслеживать.

После того, как Microsoft представила ASP.NET MVC, его проверка состояния модели стала одной из самых любимых функций среди разработчиков MVC, где на вашей модели, которая поступает из браузера в действие контроллера, вы можете добавлять украшения и валидатор модели для фреймворк проверит их за нас.

Теперь, когда ASP.NET MVC и веб-API ASP.NET согласовываются друг с другом, мы можем иметь ту же проверку состояния модели и в веб-API ASP.NET, и поддерживать ваш код в чистоте и иметь все ваши проверки в централизованном месте (внутри вашего класса что вы получаете от клиента).

Теперь давайте перейдем к коду и посмотрим, что нужно для проверки состояния модели в веб-API ASP.NET.

Это пространство имен, которое вы собираетесь использовать:

using System.ComponentModel.DataAnnotations;

Давайте создадим класс User, у которого есть некоторые атрибуты, которые мы хотели бы проверить, некоторые из них требуются, один - допустимый формат электронной почты, а другой - номер социального страхования, который использует регулярное выражение для проверки значения. Итак, вот как будет выглядеть класс:

public class User
{
  [Required, MaxLength(100)]
  public string FirstName {get;set; }
  [Required, MaxLength(150)]
  public string LastName {get;set; }
  [Required, EmailAddress]
  public int Email {get;set; }
  [RegularExpression(@"^\d{3}-\d{2}-\d{4}$")]
  public string SocialSecurityNumber {get;set; }
}

Теперь мы собираемся добавить в проект действие контроллера для создания объекта User, поэтому я добавлю контроллер User с методом POST в нем, который принимает объект User, определенный выше.

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

namespace DataAnnotationsSample.Controllers
{
   public class UserController : ApiController
   { 
        public IHttpActionResult Post(User user)
        {
           return Ok(); 
        }
    }
}

При этом веб-API не будет автоматически возвращать клиенту код состояния недопустимого запроса, и нам необходимо проверить состояние проверки модели и вернуть правильный код состояния. Для этого есть несколько вариантов.

Первый вариант - проверить объект ModelState и убедиться, что он действителен в контроллере, например:

public IHttpActionResult Post(User user)
{
   if (ModelState.IsValid)
      return Ok();
   else
      return BadRequest

Другой вариант - добавить фильтр действия ValidateModelAttribute, чтобы он выполнялся до вызова действия контроллера, и оттуда мы можем решить, хотим ли мы перейти к коду действия контроллера или вернуть клиенту BadRequest.

Вот как будет выглядеть наш фильтр действий:

namespace DataAnnotationsSample.Filters
{ 
    public class ValidateModelAttribute : ActionFilterAttribute
    { 
        public override void OnActionExecuting(HttpActionContext actionContext) 
       { 
           if (actionContext.ModelState.IsValid ==false)
           {  
              actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, actionContext.ModelState);
           }
       }
    }
}

Теперь последний шаг для того, чтобы это сработало, как и любой другой фильтр действий, который нам нужно зарегистрировать в функции Register нашего API, как это:

config.Filters.Add(new ValidateModelAttribute());

При этом нам действительно не нужно проверять свойство IsValid объекта ModelState для каждого действия контроллера (в некоторых случаях они все еще могут понадобиться, но в большинстве случаев нет).

Как видите, DataAnnotations очистили для нас много кода и поместили всю логику проверки в каждую сущность, так что, когда вы смотрите на сущность, вы знаете условия для каждого атрибута.

Еще одна удивительная вещь, которую вы получите с помощью аннотаций к данным, заключается в том, что большинство исследователей веб-API работают с этими аннотациями, и как только вы разместите их поверх своего атрибута, эта информация появится на странице онлайн-справки вашего API, и клиент сможет их увидеть. там легко.

DataAnnotations обладает большой мощностью, вы можете иметь перекрестные атрибуты проверки (скажем, вы хотите проверить, предоставлен ли хотя бы один из трех атрибутов сущности или что-то в этом роде) или у вас могут быть полные атрибуты аннотации клиентов для членов вашего класса (я буду есть еще один пост, чтобы описать эти два варианта)

Надеюсь, это немного упростит вам жизнь в создании веб-API.