Como vimos en un post anterior, cuando se trabaja con ASP.NET MVC podemos definir reglas directamente en el modelo utilizando Data Annotations (mira el post acá), sin embargo, es posible que necesitemos crear reglas adicionales para nuestros objetos de negocio, y realmente ASP.NET MVC nos facilita la vida para hacerlo.


La idea es que vamos a crear un nuevo atributo el cual nos va a permitir definir la seguridad de una contraseña, por lo tanto cuando decoremos una propiedad con el atributo nuevo le vamos a pasar un valor que indique el tipo de fuerza de la contraseña, así que manos a la obra:

Lo primero que debemos hacer es crear una clase que herede de ValidationAtribute:


public class PasswordStrongAttribute : ValidationAttribute {}

Una vez definida la clase, crearemos una enumeración para poder definir la fuerza requerida para la contraseña:


public enum TipoPassword 
{ 
    Debil, 
    Medio, 
    Fuerte 
}; 

Ahora, vamos a definir el constructor de la clase, y lo importante es que se defina un parámetro que reciba el tipo del password:


private TipoPassword _tipoPassword;
public PasswordStrongAttribute(TipoPassword tipo) 
{ 
    _tipoPassword = tipo; 
}

Lo siguiente es sobre escribir la función *ValidationResult *y allí se tendrá la lógica de validación del password:


protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
{ 
    if ( value != null) 
    { 
        var pass = value.ToString(); 
    var passLength = pass.Length; 
    switch (_tipoPassword) 
    { 
        case TipoPassword.Debil: 
            if (passLength > 4 & passLength <= 6) 
            return ValidationResult.Success; 
            break; 
        case TipoPassword.Medio: 
            if (passLength > 6 & passLength <= 10) 
            return ValidationResult.Success; 
                break; 
        case TipoPassword.Fuerte: 
            if (passLength > 10) 
           return ValidationResult.Success; 
           break; 
    } 
    } 
    return new ValidationResult("El password no cumple el formato requerido."); 
}

Finalmente solo resta adicionarlo en alguna clase de modelo (línea 24 y 25):


public class Cliente 
{ 
    public int ClienteId { get; set; } 

    [Required(ErrorMessage = "El nombre es requerido")] 
    [Display(Name = "Nombre Completo", Description = "xxxxx")] 
    public string Nombre { get; set; } 

    [Required(ErrorMessage = "El apellido es requerido")] 
    public string Apellido { get; set; } 

    [Required(ErrorMessage = "El email es requerido")] 
    [EmailAddress(ErrorMessage = "El email no tiene el formato correcto")] 
    public string Email { get; set; } 

    [Required(ErrorMessage = "La edad es requerida")] 
    [Range(12, 50, ErrorMessage = "La edad debe estar entre los 12 y los 50 años")] 
    public int Edad { get; set; } 

    [Required(ErrorMessage = "El sitio Web es requerido")] 
    [Url(ErrorMessage = "La dirección del sitio Web no es válida")] 
    public string SitioWeb { get; set; } 

    [PasswordStrong(PasswordStrongAttribute.TipoPassword.Fuerte)] 
    public string Clave { get; set; } 
}

Ahora, tenemos el siguiente controlador (sencillo, solo para mostrar si realmente la validación funciona o no):


public class ClienteController : Controller 
{
    public ActionResult Index() 
    { 
        return View(); 
    } 

    [HttpGet] public ActionResult Create() 
    { 
        return View(); 
    } 

    [HttpPost] 
    public ActionResult Create(Cliente client) 
    { 
        var state = ModelState.IsValid; 
        return View(); 
    } 
}

Ahora, cuando ingresamos datos en el formulario de creación, si se ingresa un valor para la contraseña que no cumple los requisitos lo que obtendremos es el mensaje de error:

image](http://blogjulitogtu.azurewebsites.net/wp-content/uploads/2012/11/image1.png)

Como hemos visto, realmente es muy sencillo poder crear nuestros propios atributos de validación y así poder reutilizarlos en nuestras clases de negocio.


Espero les haya gustado el post, les dejo el ejemplo!

Descarga el ejemplo!