Nuestros Ayudantes para definir y validar modelos.
Ahora vamos a hacer un chiquito más complejos los modelos que creamos.
Veamos. La teoría dice que tenemos que tener "separación de incumbencias". De acuerdo a esta norma, los datos deberían quedar reducidos exclusivamente al ámbito de los modelos y las validaciones y la lógica del negocio exclusivamente del lado de los controladores.
Bueno, en el mundo de los ideales, puede ser que sea así, pero en la realidad, eso implica costos: costo de procesamiento, de tráfico y sobre todo de código.
En aras de simplificar, la gente de MVC le pasó algún trabajito de chequeo previo de datos a las vistas, ya que las vistas pueden ejecutar código Javascript. Al mismo tiempo, al momento de definir los datos en los modelos, resultaba más sencillo definir algunas reglas de negocio a nivel de modelo (por ejemplo la obligatoriedad de un dato) en el modelo, y no cada vez que el dato era manipulado en el controlador.
Para cumplir este cometido, se crearon algunos Atributos para los datos que nos facilitan la tarea de codificar cada vez menos y de generar aplicaciones cada vez más fáciles de mantener.
Los DataAnnotations.
Entonces, vieron la luz los DataAnnotations.
El Namespace DataAnnotations contiene una colección de clases de atributos para definir los metadatos para los modelos MVC (también para Data Dynamic, ya lo veremos en las próximas clases).
¿Qué significa esto? Que nos permiten modelar nuestros datos de acuerdo a requerimientos de nuestra capa de negocio, y de esa forma quitar cientos de líneas de programación de los controllers, agregando atributos a los datos.
Con el Namespace DataAnnotations (que pertenece al namespace ComponentModel) podemos determinar si un dato es o no obligatorio, en qué rango va a operar, la cantidad de caracteres que va tener, qué etiqueta va a tener, si lo vamos a comparar contra una expresión regular, etc.
Veamos algunos ejemplos, usando el código que metimos hasta aquí.
Vamos a agregar algunas referencias a nuestros modelos.
El principal es DataAnnotations, pero ComponentModel nos agrega algunos que hacen más legible el código y más fácil de generar código para globalización, lo veremos más adelante.
Bien, ahora vamos a decirle a nuestro código que algunos campos son requeridos, vamos a ponerle etiquetas a los campos que la necesiten, y a agregar un rango de valores válidos para el DNI. ¿Cómo? Así;
Es tan fácil como eso. El espacio de nombres nos ofrece una serie de clases que se agregan como atributos a las propiedades del modelo, y nos permiten agregar validaciones a los datos, de forma tal que cuando los recibe el controlador, apliquemos un sólo método en un objeto que se llama "ModelStateDictionary". El método se llama "IsValid". Al ejecutarse este método, se van a validar todas las DataAnnotations que hayamos puesto en nuestro modelo.
Pretty Bonito, ¿Eh?
Extendiendo las extensiones
Si esto les parece magnífico, ¿qué les parece extender estas validaciones para hacer CUALQUIER validación?
Veamos cómo.
Vamos a agregar una nueva carpeta a nuestro proyecto. Le ponemos de nombre "Infraestructure" En esa carpeta, vamos a agregar una clase que nos permita extender la clase RegularExpressionAttribute, para validar que lo que ingresen en un campo sea una URL Válida.
Agregamos la clase, que se va a llamar en este caso "UrlAttribute". Del nombre de la clase, lo que pongamos antes de Attribute va a ser lo que pongamos luego como "Adorno" en nuestras propiedades.
La clase la vamos a hacer heredar de RegularExpressionAttribute, ya que vamos a usar una validación de RegularExpression.
El código quedaría entonces máso meno Sasí:
¡Qué fácil, Chiquilines! ¿Qué hace esta clase? Lo que está haciendo es pasarle a la Base (RegularExpressionAttribute) la cadena de regularExpression que valida una URL. Entonces, en lugar de esperar una cadena Regex, ya va a tener una asignada que va a validar exclusivamente una URL. (a propósito, la cadena completa es: @"(?i)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'"".,<>?«»“”‘’]))"
Bien. Eso es todo por hoy. El sábado nos volvemos a encontrar para seguir regando la plantita, y practicando un poco más.
Saludos!
Suscribirse a:
Enviar comentarios (Atom)




No hay comentarios:
Publicar un comentario