MVC .NET proporciona una serie de validadores de datos estandard que pueden
ser usados para controlar los datos de un formulario antes de que la información de este formulario sea procesada, pero veamos que sucede cuando necesitamos validar un campo
de un tipo no estandard, por ejemplo el DNI español, o sea una cadena de nueve carateres donde los primeros ocho son numeros y el último es una letra.
En este caso se podría diréctamente usar la validación mediante una expresión regular:
[RegularExpression("^(([A-Z]\\d{8})|(\\d{8}[A-Z]))$", ErrorMessage = "DNI incorrecto")] [Display(Name = "Ingrese su DNI")] public string DNI { get; set; }
pero resolveremos el problema implementando un validador «personalizado», que puede servir de ejemplo para trabajar con casos mas complejos.
Los pasos a seguir son los siguientes:
1) Creamos un nuevo proyecto MVC, dentro del cual creamos una nueva clase, que llamaremos DNIAttribute.cs y que extende la clase ValidationAttribute
public class DNIAttribute : ValidationAttribute { }
2) Implementamos el método IsValid
public override bool IsValid(object value) { var dni = Convert.ToString(value); if (String.IsNullOrEmpty(dni)) { return true; } if (!Regex.IsMatch(value.ToString(), "^(([A-Z]\\d{8})|(\\d{8}[A-Z]))$")) { return false; } return true; }
3) Ahora abrimos el archivo AccountModel.cs y en la clase RegisterModel agregamos el campo DNI, y agregamos el validador DNI con su mensaje de error, de modo de poder probar su funcionamiento:
[DNI (ErrorMessage="DNI incorrecto")] [Display(Name = "Ingrese su DNI")] public string DNI { get; set; }
4)Modificamos tambien la vista Register.aspx, agregando alli tambien el campo:
<div class="editor-label"> <%: Html.LabelFor(m => m.DNI) %> </div> <div class="editor-field"> <%: Html.TextBoxFor(m => m.DNI)%> <%: Html.ValidationMessageFor(m => m.DNI)%> </div>
5) Lanzando en modalidad debug el sitio (F5), vamos a la pagina http://misitio.com/Account/Register e, ingresando un DNI no valido, vemos que bloquea el formulario.
En caso que los datos sean correctos continua con el proceso.
Desde este enlace pueden descargar el código fuente de este ejemplo