Modèle etat de besoin

J`ai également obtenu un projet d`échantillon très simple sur GitHub qui montre comment le ModelState fonctionne et fournit tout le code et le balisage dans ce post. Regardez! Brad Wilson blog post “validation d`entrée vs modèle de validation dans ASP.NET MVC” a une bonne discussion sur la sous-signalisation et sur-affichage. Bien que le message soit à propos de ASP.NET MVC 2, les problèmes sont toujours pertinents pour l`API Web. Mais que faire si nous devions effectuer une validation plus complexe que ce qui est fourni par les attributs? Supposons que nous devions valider que le prénom et le nom ne sont pas identiques, et afficher un message d`erreur particulier lorsque cela se produit. Pour implémenter ceci, créez un filtre d`action personnalisé qui vérifie la validité de l`état du modèle. Lorsque ModelState. IsValid a la valeur false, il retourne un BadRequestObjectResult contenant le ModelState. Comme, cela signifie Model. IsValid = = false. Si j`avais un résumé de validation sur la page-cela l`invoquerait. mais ce code exacte devra être ajouté non seulement à chaque contrôleur, mais à chaque action sur ce contrôleur. (Il s`aggrave: afin de simplement renvoyer un message d`erreur convivial, vous devez creuser dans le ModelState assez profondément pour les tirer tous.) Faire cela impliquera la duplication, pas seulement du code, mais de la connaissance de la façon de manipuler des modèles invalides.

C`est l`heure de la refactorisation. Lors de la soumission du formulaire, si vous avez une erreur dans la date, ModelState. IsValid sera false et vous obtiendrez une erreur, mais uniquement pour la date, car AddRuleViolations n`a jamais été exécutée. Si vous supprimez complètement la vérification de ModelState. IsValid, vous obtiendrez toutes les erreurs (en raison de l`exception), y compris un marquage dans la date où il n`est pas valide. Alors, pourquoi est le chèque pour ModelState. IsValid là à tous? J`ai raté quelque chose? Première option consiste à vérifier l`objet ModelState et voir si elle est valide dans le contrôleur comme: pour un peu plus d`informations, consultez Professional ASP.NET MVC 5, en particulier le chapitre 6, qui détaille les méthodes de validation à l`aide de la ModelState. La raison est que normalement, vous voulez la publication au client le formulaire avec toutes les erreurs.

Ainsi, lorsque vous remettez le paramètre qui contient votre modèle à la vue à renvoyer, celui-ci utilise la valeur de ModelState. L`une des raisons possibles est que ModelState n`est pas conservé entre les requêtes. Il peut être, mais vous devez le copier quelque part plus permanent. TempData est un endroit idéal pour cela et puisque je ne suis pas la première personne à avoir ce moment de clarté, il y a déjà du code disponible pour le faire (dans MvcContrib et par Kazi Manzur Rashid).