2010-07-26 6 views
0

J'ai donc utilisé des annotations de données pour ma validation dans un projet MVC et elles semblent fonctionner dans la plupart des scénarios.Validation MVC à l'aide d'annotations de données - Scénarios où cela ne fonctionne pas, Alternatives?

Voici deux exemples dans mon projet actuel où ils ne semblent pas correspondre et je ne suis pas sûr du meilleur endroit pour mettre la validation.

1) J'ai une page Joindre la ligue qui contient un formulaire où l'utilisateur connecté entre le nom de son équipe et clique pour rejoindre la ligue. Quand ils soumettent le formulaire je dois m'assurer que l'utilisateur actuel n'a pas déjà une équipe dans la ligue. Donc, il doit essentiellement interroger la base de données pour cet id d'utilisateur et l'identifiant de ligue pour s'assurer qu'aucune équipe existe pour l'utilisateur. Mon ViewModel ne contient pas d'identifiant d'utilisateur, car il n'est pas pertinent pour la vue.

2) Sur cette même page, je dois également m'assurer que le nom de l'équipe est unique. C'est facile si vous cherchez juste à voir si elle existe dans une table. Vous créez un attribut de validation personnalisé que la requête est une table pour la valeur du champ. Cependant, j'ai besoin de voir si elle existe dans une table pour un certain identifiant de ligue. (la ligue qu'ils rejoignent.)

Il ne semble pas que les annotations de données soient une solution idéale pour toute validation autre que triviale. Ma solution actuelle consiste à interroger la base de données au début de la méthode post action et à ajouter manuellement l'erreur à ModelState. (oui, terrible)

Des idées?

Répondre

2

Je pense qu'il peut être utile de réfléchir à la différence entre Input Validation et Business Logic. Ayende a quelques réflexions à ce sujet here

Des règles comme «Quand ils soumettent le formulaire dont j'ai besoin pour m'assurer que l'utilisateur actuel n'a pas d'équipe dans la ligue» ressemble à Business Logic, pas à Input Validation, et vous peut vouloir le gérer d'une manière différente. Cette logique pourrait, par exemple, aller dans une méthode 'CanSave' sur une classe 'User' ou quelque chose de similaire - la chose clé est de séparer cela de Input Validation si vous le pouvez.

+0

Merci pour votre perspicacité, je pense que vous avez raison. :) –

1

Bien que je sois d'accord avec Steve, DataAnnotations a une base ValidationAttribute dans laquelle vous pouvez implémenter tout ce que vous voulez. Dire qu'il ne peut que faire des choses triviales n'est pas précis en fait avec ce point d'extensibilité, vous pouvez faire presque tout ce que vous voulez.

Maintenant, il y a quelques problèmes avec l'emplacement du service étant partout en ayant la logique de base de données dans votre code, mais il y a des options pour nettoyer cela. Les DataAnnotations sont appliquées via une classe ModelValidatorProvider qui peut facilement être configurée comme vous le feriez avec ControllerFactories ou ViewEngines.

ModelValidatorProviders.Providers.Add (nouveau YourCustomProvider());

Maintenant, ce que vous pouvez faire dans ce cas est que votre fournisseur de validateurs fournisse le code de couche de persistance dans votre attribut. Ainsi, le code reste propre mais vous pouvez utiliser des attributs d'annotation de données personnalisés qui touchent la base de données.

Questions connexes