Проверка модели .NET Core Web API - PullRequest
0 голосов
/ 22 октября 2018

У меня есть метод, который в общем случае выглядит так:

    public IActionResult SomeAction(Guid id, [FromBody] Request request)
    {
       //bunch of other stuff left out
       AnotherObject obj = Mapper.Map(request);
      if (ModelState.IsValid) {//only validation errors on the request object are found
//obj validation errors are ignored
}
    }

В классе Request я использую DataAnnotations для проверки состояния модели, и они работают нормально.Однако внутри AnotherObject я также использую DataAnnotations, и когда я тестирую ModelState в этой функции, .NET видит ошибки проверки из объекта Request, но не в сопоставленном объекте.

Вызывающие абоненты этой конечной точки нене знаю о AnotherObject, и не нужно.Есть ли способ заставить .NET уважать проверки объекта, который создается внутри действия контроллера и не передается?

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

ModelState проверяет модель при преобразовании JSON в запрос типа.Следовательно, ModelState проверяет нулевые значения и несовпадающие типы.При сопоставлении request с obj не вызывается ModelState.

Следовательно, использование:

if (ModelState.IsValid) {
  AnotherObject obj = Mapper.Map(request);
}

проверяет модель во время отображения ... Вам действительно не нужны два средства проверки ModelState

0 голосов
/ 22 октября 2018

Вы можете использовать объект Validator для ручного тестирования объектов:

var obj = Mapper.Map(request);
var context = new ValidationContext(obj, serviceProvider: null, items: null);
var results = new List<ValidationResult>();

var isValid = Validator.TryValidateObject(obj, context, results);

См. этот короткий учебник для получения дополнительной информации.

Примечаниечто это не работает рекурсивно, в зависимости от сложности AnotherObject, вам может понадобиться использовать Reflection для самостоятельного прохождения объекта.

...