2012-01-05 10 views
9

Da utilizzare per un'applicazione mvc3 .net basata sul Web, quale framework di convalida raccomanderesti? L'applicazione segue il modello del modello di dominio e i modelli di dominio I POCO si trovano in una libreria di classi separata?Quale framework di convalida raccomanderesti per i progetti .net?

Il tipo di convalida che sarà richiesto sarà ... Non Null, Regular Expression ecc basato

+0

Avete trovato vantaggi/svantaggi confronti tra diversi quadri? –

risposta

18

vorrei andare con FluentValidation, è un progetto fantastico open source

https://github.com/JeremySkinner/FluentValidation

E ' ugualmente valido per convalide di base e più complesse

+0

come su spring.net? – InfoLearner

+0

@KnowledgeSeeker mi è sembrato inutilmente complicato ... ma non ho usato un vero progetto per dare un parere valido su di esso. tutto quello che posso dire è che FluentValidation sembra una grande soluzione per i progetti mvc –

+0

Hai esperienza con EntLib Application Block? Se sì, perché preferisci FluentValidation? –

3

Se è necessario un elenco di errori (e non uno alla volta eccezioni), mi piace il blocco di convalida di Enterprise Library.

Vedi la presentazione di PowerPoint in: http://msdn.microsoft.com/en-us/library/ff650484.aspx

È possibile cablare convalide più elementari contro i tuoi oggetti POCO. E un sacco di regole prefabbricate può essere impostato in un file .config.

E puoi scrivere le tue regole.

Le mie regole sono molto granulari. Eseguono 1 convalida alla volta.

Come un semplice esempio: avrei 2 regole diverse per decidere se un dipendente è accettabile (in base alla data di nascita). Una regola assicurerebbe che sia stata specificata la data di nascita del dipendente.
Una seconda regola assicurerebbe che la data corrente meno la data di nascita fosse maggiore di 18 anni. (o qualunque sia stata la regola).

(Ora supponiamo di avere un sacco di regole in atto). Quindi, dopo che le routine di validazione sono state eseguite, torno all'elenco di tutte le situazioni (non valide). Ad esempio, se dovessi convalidare un dipendente, otterrei un elenco di invalidi.

"non ha fornito Cognome"

"non ha fornito FirstName"

"non ha fornito SSN"

invece di "uno alla volta". (farlo "uno alla volta" richiederebbe potenzialmente molti passaggi per capire finalmente la validità dei tuoi assegni).

Di seguito è riportato un codice di esempio. Diciamo che qualcuno ha provato a comprare un libro con ISBN "ABC123456".

La seguente è una regola personalizzata che controlla se questo libro esiste (nel database del prodotto, ad esempio). Penso che tu possa seguire. Sarebbe collegato al poco oggetto Book (.cs). (Non viene mostrato nessuno dei "cavi"). Sto solo cercando di darti un rapido esempio di quanto sia difficile (o non difficile) creare una regola semplice.

Quando un libro non viene trovato (utilizzando l'isbn) .... allora viene visualizzato il metodo validationResults.AddResult. È così che ottieni più invalidi. Avrai accesso alla raccolta più tardi quando stai controllando la query di convalida.

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

hai usato il framework di validazione di spring.net? – InfoLearner

+1

No. Non l'ho fatto. Ho iniziato con EnterpriseLibrary e ho capito che avrei potuto ottenere ciò di cui avevo bisogno in circa 2 giorni. Vedi: http://stackoverflow.com/questions/3806447/spring-net-vs-enterprise-library e http://stackoverflow.com/questions/751700/which-validation-framework-to-choose-spring-validation- o-validation-applicatio per ulteriori commenti sui due. La Enterprise Library ha sempre avuto un buon supporto e documentazione, quindi l'ho mantenuta negli anni. Stavo già usando E.L.Data, quindi usare il blocco di validazione è stata una transizione facile per me. – granadaCoder

Problemi correlati