2012-01-05 5 views
9

Aby skorzystać z internetowej aplikacji mvc3 .net, jakie ramy sprawdzania zaleciłbyś? Aplikacja podąża za wzorcem modelu domeny i modelami domen POCO są w osobnej bibliotece klas?Jakie ramy sprawdzania poprawności poleciłbyś do projektów .net?

rodzaj walidacji, które będą wymagane będzie ... Nie Null, Regular Expression opiera itp

+0

Czy znalazłeś jakieś zalety/wady porównania różnych ram? –

Odpowiedz

18

pójdę z FluentValidation, to niesamowite projekt open source

https://github.com/JeremySkinner/FluentValidation

To równie dobrze dla podstawowych i bardziej złożonych sprawdzeń

+0

co z spring.net? – InfoLearner

+0

@KnowledgeSeeker wydawał mi się niepotrzebnie skomplikowany ... ale nie wykorzystałem go w prawdziwym projekcie do wydania ważnej opinii na jego temat. wszystko, co mogę powiedzieć, to że FluentValidation wydaje się być świetnym rozwiązaniem dla projektów mvc. –

+0

Czy masz doświadczenie z blokowaniem aplikacji EntLib Validation? Jeśli tak, dlaczego wolisz FluentValidation? –

3

Jeśli potrzebujesz listy błędów (i nie ma żadnych wyjątków), podoba mi się blok Enterprise Library Validation.

Zobacz prezentację programu PowerPoint w: http://msdn.microsoft.com/en-us/library/ff650484.aspx

Można podłączyć się najbardziej podstawowe walidacje przed obiektami POCO. I wiele wcześniejszych reguł można skonfigurować w pliku .config.

Możesz pisać własne zasady.

Moje zasady są bardzo szczegółowe. Wykonują 1 walidację na raz.

Jako prosty przykład: miałbym 2 różne zasady, aby zdecydować, czy pracownik jest do wynajęcia (na podstawie daty urodzenia). Jedna zasada zapewniałaby określenie daty urodzenia pracownika.
Druga zasada sprawiłaby, że aktualna data minus data urodzenia była większa niż 18 lat. (lub jakakolwiek reguła była).

(Teraz załóżmy, że mam kilka zasad na miejscu). Po uruchomieniu procedur sprawdzania poprawności otrzymuję listę wszystkich (nieważnych) sytuacji na liście. Na przykład, gdybym walidował pracownika, otrzymywałbym listę osób niepełnosprawnych.

"nie przewiduje LastName"

"nie podał FirstName"

"nie podał SSN"

zamiast "jednym na raz". (robienie tego "jeden na raz" zajęłoby potencjalnie wiele przebiegów, aby w końcu ustalić ważność twoich czeków).

Poniżej znajduje się przykładowy kod. Powiedzmy, że ktoś próbował kupić książkę z ISBN "ABC123456".

Poniżej znajduje się niestandardowa reguła, która sprawdzi, czy książka istnieje (na przykład w bazie danych produktów). Myślę, że możesz śledzić dalej. Byłby podłączony do obiektu poc. Book (.cs). (Nie pokazano żadnego "przewodu w górę"). Po prostu próbuję dać ci szybki przykład tego, jak trudne (lub nie trudne) jest stworzenie prostej reguły.

Gdy książka nie zostanie znaleziona (używając isbn) .... wtedy widzisz metodę validationResults.AddResult. W ten sposób dostajesz wielu inwalidów. Będziesz mieć dostęp do kolekcji później podczas sprawdzania kwerendy sprawdzania poprawności.

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

czy użyłeś ramy sprawdzania poprawności Spring.net? – InfoLearner

+1

Nie. Nie. Zacząłem od EnterpriseLibrary i odkryłem, że mogę dostać to, czego potrzebowałem w około 2 dni. Zobacz: http://stackoverflow.com/questions/3806447/spring-net-vs-enterprise-library i http://stackoverflow.com/questions/751700/which-validation-framework-to-choose-spring-validation- lub-validation-applicatio, aby uzyskać więcej komentarzy na temat tych dwóch. Biblioteka Enterprise zawsze miała dobre wsparcie i dokumentację, więc utknąłem z nią przez lata. Używałem już E.L.Data, więc użycie bloku sprawdzania poprawności było dla mnie łatwym przejściem. – granadaCoder

Powiązane problemy