0

Je dois valider trois choses lorsqu'un consommateur de mon API essaie de faire une mise à jour sur un client.Validation de modèle dans l'API Web

Prévenir le client à être mis à jour si:

  1. Le prénom ou le nom sont vides

  2. Pour un pays, si la collecte intérieure du client de X est vide, jetez un exception. X est difficile à expliquer, alors supposons que c'est une collection. Pour tous les autres pays, X ne s'applique pas/sera toujours vide. Mais si c'est un certain pays, alors X est requis. C'est donc presque un attribut requis conditionnel. Un client appartient à un pays, il est donc déterminé à partir du JSON envoyé. Empêche le client d'être mis à jour si certaines conditions de la base de données sont vraies.

Donc, fondamentalement, je suis coincé avec le problème suivant, et je voulais quelques conseils sur la façon la plus appropriée pour le résoudre:

-je créer un filtre d'action pour faire la validation de l'entité client avant que l'économie ait lieu? Ou serait-il préférable de créer un attribut de validation personnalisé dérivé de ValidationAttribute et de surcharger la fonction membre IsValid.

Fondamentalement, une question de dire si (nom est vide, si x, si y, etc.) vs (! ModelState.IsValid)

Et puis en utilisant IsValid pour provoquer les attributs personnalisés au travail.

Il semble que les attributs de validation soient les meilleurs pour la validation "simple", c'est-à-dire le champ obligatoire. Mais une fois que vous commencez à entrer dans des choses comme "J'ai besoin de regarder ma base de données, ou d'analyser l'en-tête de requête http pour des valeurs personnalisées, et invalide = false", il semble presque faux de faire ce genre de choses si près de l'entité.

Pensées?

Merci!

Répondre

2

J'aime beaucoup FluentValidation: https://github.com/JeremySkinner/FluentValidation

Comme vous avez mentionné INTÉGRÉE dans les attributs de validation sont limitées. Pour les validations complexes, il vaut mieux implémenter vos propres attributs ou utiliser une bibliothèque comme celle-ci. Une chose que j'aime à propos de FluentValidation est qu'elle fonctionne au niveau du modèle plutôt qu'au niveau du champ, ce qui signifie que vous pouvez utiliser les valeurs des champs associés pour la validation. Par exemple

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

(extrait de code tiré de la page Wiki du projet)

Il est également extensible de sorte que vous pouvez développer vos propres validateurs personnalisés au-dessus de cette bibliothèque ainsi.