2012-01-05 7 views
9

Para usar en una aplicación mvc3 .net basada en web, ¿qué marco de validación recomendaría? La aplicación sigue el patrón de modelo de dominio y los modelos de dominio. Las POCO se encuentran en una biblioteca de clases separada.¿Qué marco de validación recomendaría para los proyectos .net?

El tipo de validación que será requerida será ... No es nulo, de expresiones regulares basadas etc

+0

¿Has encontrado alguna ventaja/desventaja comparaciones de diferentes marcos? –

Respuesta

18

Me gustaría ir con FluentValidation, es un proyecto de código abierto impresionante

https://github.com/JeremySkinner/FluentValidation

¡Es igualmente bueno para validaciones básicas y más complejas

+0

¿qué tal spring.net? – InfoLearner

+0

@KnowledgeSeeker me pareció innecesariamente complicado ... pero no lo utilicé en un proyecto real para dar una opinión válida al respecto. todo lo que puedo decir es que FluentValidation parece una gran solución para proyectos de mvc –

+0

¿Tiene experiencia con el Bloque de aplicación de validación de EntLib? En caso afirmativo, ¿por qué prefiere FluentValidation? –

3

Si necesita una lista de fallas (y no de a una por vez excepciones), entonces me gusta el bloque de Validación de la biblioteca de la empresa.

Ver la presentación de PowerPoint en: http://msdn.microsoft.com/en-us/library/ff650484.aspx

Puede cablear validaciones más básicos en contra de sus objetos POCO. Y muchas de las reglas prefabricadas se pueden configurar en un archivo .config.

Y usted puede escribir sus propias reglas.

Mis reglas son muy detalladas. Realizan 1 validación a la vez.

Como un simple ejemplo: Me tengo 2 reglas diferentes para decidir si un empleado es hireable (basado en la fecha de nacimiento). Una regla aseguraría que se especificó la fecha de nacimiento del empleado.
Una segunda regla aseguraría que la fecha actual menos la fecha de nacimiento fuera mayor a 18 años. (o cualquiera que sea la regla).

(Ahora supongamos que tengo un montón de reglas en su lugar). Entonces, después de ejecutar las rutinas de validación, obtengo una lista de todas las situaciones (inválidas) en una lista. Por ejemplo, si estuviera validando a un empleado, obtendría una lista de inválidos.

"no proporcionó Apellido"

"No proveyó Nombre"

"No proveyó SSN"

en lugar de "uno a la vez". (hacerlo "de uno en uno" tomaría potencialmente muchos pases para determinar finalmente la validez de sus cheques).

A continuación se muestra un código de muestra. Digamos que alguien intentó comprar un libro con el ISBN "ABC123456".

A continuación es una regla personalizada que comprobar para ver si existe ese libro (en su base de datos de productos, por ejemplo). Creo que puedes seguirlo. Sería conectado contra el objeto libro (.cs) poco. (No se muestra ninguno de los "cables arriba"). Solo intento darte un ejemplo rápido de lo difícil (o no) que es crear una regla simple.

Cuando no se encuentra un libro (usando el isbn) .... entonces verá el método validationResults.AddResult. Así es como obtienes múltiples inválidos. Tendrás acceso a la colección más tarde cuando estés verificando la consulta de validación.

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

has utilizado spring.net validation framework? – InfoLearner

+1

No. No tengo. Empecé con EnterpriseLibrary y descubrí que podía obtener lo que necesitaba en aproximadamente 2 días. Ver: http://stackoverflow.com/questions/3806447/spring-net-vs-enterprise-library y http://stackoverflow.com/questions/751700/which-validation-framework-to-choose-spring-validation- o-validation-applicatio para más comentarios sobre los dos. La Enterprise Library siempre ha tenido un buen soporte y documentación, así que me he mantenido fiel a esto a través de los años. Ya estaba usando E.L.Data, por lo que usar el bloque de Validación fue una transición fácil para mí. – granadaCoder

Cuestiones relacionadas