0

Мне нужно проверить три вещи, когда потребитель моего API пытается выполнить обновление для клиента.Проверка модели в веб-API

Предотвратить клиент будет обновляться, если:

  1. Первое имя или фамилия являются пустыми

  2. Для определенной страны, если внутренний сбор клиента из X пусто, то бросаться исключение. X трудно объяснить, поэтому просто предположим, что это какая-то коллекция. Для всех других стран X не применяется/всегда будет пустым. Но если это определенная страна, тогда требуется X. Так что это почти условный обязательный атрибут. Клиент принадлежит стране, поэтому он выясняется из отправленного JSON.

  3. Предотвращение обновления клиента, если выполняются некоторые условия в базе данных.

Поэтому в основном я застрял со следующей проблемой, и я хотел несколько советов по наиболее надлежащим образом решить:

ли я создать действие фильтр, чтобы сделать проверку на лице клиента до сохранения? Или было бы лучше создать собственный атрибут проверки, полученный из ValidationAttribute, и переопределить функцию члена IsValid.

В принципе вопрос сказать если (первое имя пустое, если х, если у, и т.д.) против (!) ModelState.IsValid

А затем с помощью IsValid, чтобы вызвать пользовательские атрибуты для работы.

Кажется, что атрибуты проверки являются лучшими для «простой» проверки, то есть требуемого поля. Но как только вы начнете проникать в такие вещи, как «Мне нужно посмотреть на мою базу данных или проанализировать заголовок http-запроса для пользовательских значений, и на основе этого, invalid = false», тогда почти кажется неправильным делать такие вещи, которые так близки к лицо.

Мысли?

Спасибо!

ответ

2

Мне нравится FluentValidation много: https://github.com/JeremySkinner/FluentValidation

Как упоминалось встроенные атрибуты проверки ограничены. Для сложных проверок вам лучше реализовать свои собственные атрибуты или использовать такую ​​библиотеку.

Одна вещь, которая мне нравится в FluentValidation, заключается в том, что она выполняется на уровне модели, а не на уровне поля, что означает, что вы можете использовать значения связанных полей для проверки. Например

RuleFor(customer => customer.Discount).NotEqual(0).When(customer => customer.HasDiscount); 

(фрагмент кода взят из вики страницы проекта)

Это также расширяемым, так что вы можете разработать свои собственные валидаторы на вершине этой библиотеки, а также.