2012-01-05 4 views
9

À utiliser pour une application Web mvc3 .net, quel cadre de validation recommanderiez-vous? L'application suit le modèle de domaine modèle et les modèles de domaine Les POCO sont dans une bibliothèque de classes séparée?Quel cadre de validation recommanderiez-vous pour les projets .net?

Le genre de validation qui sera nécessaire sera ... Non nul, etc. d'expressions régulières

+0

Avez-vous trouvé des avantages/des inconvénients comparaisons de cadres différents? –

Répondre

18

J'irais avec FluentValidation, c'est un projet impressionnant open source

https://github.com/JeremySkinner/FluentValidation

Il est tout aussi bon pour les validations de base et plus complexes

+0

qu'en est-il de spring.net? – InfoLearner

+0

@KnowledgeSeeker m'a semblé inutilement compliqué .. mais je n'ai pas utilisé dans un vrai projet pour donner une opinion valide à ce sujet. tout ce que je peux dire, c'est que FluentValidation semble être une excellente solution pour les projets mvc –

+0

Avez-vous de l'expérience avec EntLib Validation Application Block? Si oui, pourquoi préférez FluentValidation? –

3

Si vous avez besoin d'une liste d'échecs (et non d'exceptions à la fois), alors j'aime le bloc Validation de la bibliothèque d'entreprise.

Voir la présentation powerpoint à: http://msdn.microsoft.com/en-us/library/ff650484.aspx

Vous pouvez câbler les plus élémentaires contre les validations de vos objets POCO. Et beaucoup de règles préfabriquées peuvent être installées dans un fichier .config.

Et vous pouvez écrire vos propres règles.

Mes règles sont très granulaires. Ils effectuent 1 validation à la fois.

À titre d'exemple simple: j'aurais deux règles différentes pour décider si un employé est disponible (en fonction de la date de naissance). Une règle assurerait que la date de naissance de l'employé a été spécifiée.
Une deuxième règle permettrait de s'assurer que la date du jour moins la date de naissance était supérieure à 18 ans. (ou quelle que soit la règle).

(Supposons maintenant que j'ai un tas de règles en place). Donc, après l'exécution des routines de validation, je récupère une liste de toutes les situations (invalides) dans une liste. Par exemple, si je validais un employé, j'obtiendrais une liste d'invalidité.

"N'a pas fourni LastName"

"N'a pas fourni FirstName"

"N'a pas fourni SSN"

au lieu de "un à la fois". (le faire "un à la fois" prendrait potentiellement plusieurs passes pour finalement comprendre la validité de vos chèques).

Voici un exemple de code. Disons que quelqu'un a essayé d'acheter un livre avec ISBN "ABC123456". La règle ci-dessous est une règle personnalisée qui vérifie si ce livre existe (dans votre base de données de produits par exemple). Je pense que vous pouvez suivre. Il serait câblé contre l'objet poco Book (.cs). (Aucun "fil" n'est affiché). J'essaie simplement de vous donner un exemple rapide de la difficulté (ou non) de créer une règle simple.

Lorsqu'un livre n'est pas trouvé (en utilisant isbn) .... alors vous voyez la méthode validationResults.AddResult. Voilà comment vous obtenez plusieurs invalides. Vous aurez accès à la collection plus tard lorsque vous vérifiez la requête de validation.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Text.RegularExpressions; 

using Microsoft.Practices.EnterpriseLibrary.Validation; 
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators; 


namespace MyCompany.Applications.MyApplication.BusinessLogic.Validation.MyType1Validations 
{ 
    [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] 
    public class BookExistsValidatorAttribute : ValidatorAttribute 
    { 
     protected override Validator DoCreateValidator(Type targetType) 
     { 
      return new BookExistsValidator("BookExistsValidatorTag"); 
     } 
    } 

    public class BookExistsValidator : Validator<string> 
    { 

     public BookExistsValidator(string tag) : base("BookExistsValidatorMessageTemplate", tag) { } 

     protected override string DefaultMessageTemplate 
     { 
      get { throw new NotImplementedException(); } 
     } 

     protected override void DoValidate(string objectToValidate, object currentTarget, string key, ValidationResults validationResults) 
     { 

      bool bookExists = BookMatchExists(objectToValidate); 

      if (!bookExists) 
      { 
       string msg = string.Format("The Book does not exist. Your ISBN='{0}'", objectToValidate); 
       validationResults.AddResult(new ValidationResult(msg, currentTarget, key, 10001, this)); /* 10001 is just some number I made up */ 

      } 


     } 

     private bool BookMatchExists(string isbn) 
     { 
      bool returnValue = false; 

      IBookCollection coll = MyCompany.Applications.MyApplication.BusinessLogic.CachedControllers.BookController.FindAll(); /* Code not shown, but this would hit the db and return poco objects of books*/ 

      IBook foundBook = (from item in coll where item.ISBN.Equals(book, StringComparison.OrdinalIgnoreCase) select item).SingleOrDefault(); 

      if (null != foundBook) 
      { 
       returnValue = true; 
      } 
      return returnValue; 
     } 



    } 
} 
+0

avez-vous utilisé le framework de validation spring.net? – InfoLearner

+1

Non, je ne l'ai pas. J'ai commencé avec l'EnterpriseLibrary, et j'ai compris que je pourrais obtenir ce dont j'avais besoin dans environ 2 jours. Voir: http://stackoverflow.com/questions/3806447/spring-net-vs-enterprise-library et http://stackoverflow.com/questions/751700/which-validation-framework-to-choose-spring-validation- ou-validation-applicatio pour plus de commentaires sur les deux. La bibliothèque d'entreprise a toujours bénéficié d'un support et d'une documentation de qualité, ce qui m'a permis de rester fidèle au fil des ans. J'utilisais déjà le fichier E.L.Data, donc utiliser le bloc de validation était une transition facile pour moi. – granadaCoder

Questions connexes