Está en la página 1de 6

18/02/13

Validaciones en ASP.NET MVC


Buscar

Portada

Monotemticos

Secciones

Blogging

Comunidad

Wiki

RSS

Usuarios: Login | Registro

DesarrolloWeb.com > Manuales > Manual del framework ASP.NET MVC

Validaciones en ASP.NET MVC


Anuncios Google

ASP Net MVC

Validaciones
Valoracin del artculo: 1 voto

PHP MVC
Enviar un comentario

MVC 3

27 de diciembre de 2011 Compartir en redes sociales

Vemos qu son las validaciones en ASP .NET MVC y cmo utilizarlas de una forma efectiva.
Por Eduard Tom s
Seguir a @eixim enis

Manuales relacionados
Manual del framework ASP.NET MVC (13 artculos)
Ver el ndice del manual Descargar el manual

En los dos artculos anteriores hemos visto como enviar datos a un controlador usando POST y como generar los formularios usando los helpers. Introdujimos tambin el concepto de Model Binding (como ASP.NET MVC era capaz de construir un objeto que reciba el controlador a partir de los datos de la peticin) y vimos como al usar los helpers obtenamos gratuitamente algunas validaciones, p.ej. si declarbamos un campo como int, ASP.NET MVC comprobaba que no entrsemos caracteres alfanumricos. De hecho lo que vemos automticamente al usar los helpers no son validaciones, son errores. Si introducimos una cadena alfanumrica en un campo que se ha declarado como int, cuando el Model Binder debe enlazar los datos genera un error. Los errores que el Model Binder se encuentra al intentar enlazar los valores de la request con las propiedades del viewmodel son guardados en el ModelState y pueden ser consultados desde el propio controlador y tambin desde la vista. De hecho, como vimos en el artculo anterior, los helpers consultan el ModelState para usar una clase CSS especfica en caso de que haya algn error asociado con el campo. Intentar convertir una cadena alfanumrica en un int es pues un error, pero hay muchos ms casos en los que nos puede interesar decirle al usuario que los datos entrados son incorrectos: campos obligatorios, cadenas con un determinado formato (p.ej. un email) o dos campos que deben tener el mismo valor (p.ej. contrasea y comprobar contrasea). Son esos casos cuando nos referimos a validaciones y es lo que vamos a tratar en nuestro artculo. Pero aunque nosotros diferenciemos entre errores y validaciones ASP.NET MVC no lo hace: ambos son tratados igual, es decir ambos son guardados en el ModelState. Pero antes de profundizar ms, veamos exactamente que es el ModelState.

Categorias relacionadas
.NET

El autor
Eduard Toms Technology Specialist en raona http://geeks.ms/blogs/etomas

ltimas noticias
Los mejores proveedores de hosting Enero 2013 La primera clasificacin del ao continua apuntando a Datapipe como la compaa con el... Listo para Fedora 19? El equipo de trabajo de esta distribucin GNU/Linux anuncia la fecha del lanzamiento de la...

ModelState o estado del modelo


El ModelState es un objeto, gestionado por el framework de ASP.NET MVC que indica cual es el estado del modelo. En este contexto por modelo entendemos el objeto que recibe un controlador (lo que generalmente llamamos view model) y por estado entendemos si es correcto o no. Correcto significa que los datos de la peticin eran vlidos y que el Model Binder ha podido crear un objeto y rellenarlo. Incorrecto significa que haba algn dato de la peticin invlido, ya sea por algn error (una cadena alfanumrica se ha intentado asignar a un int) o bien por alguna validacin fallida (una cadena declarada como email no tena el formato correcto). El ModelState es bsicamente un diccionario donde: 1. Las claves son los nombres de las propiedades de nuestro modelo (realmente son los nombres que usa el Model Binder para enlazar las propiedades pero podemos asumir que coinciden). 2. Por cada clave hay el valor que el Model Binder ha asignado a esa clave y lo que ms nos importa: una coleccin de los errores vinculados a esa clave si los hubiese. Y cuando aqu digo errores me refiero tanto a errores como a validaciones fallidas.

HTML5 con sistema anticopia? Algunos sectores de Internet proponen la inclusin de mecanismos de proteccin tipo DRM en...

Ciclo de vida de Windows 7 Dos aos despus de lanzar el service pack se acerca el fin de la primera etapa de soporte...

Donaciones
Si piensas que te hemos ayudado y merecemos tu apoyo econmico...

www.desarrolloweb.com/articulos/validaciones-aspnet-mvc-donet.html

1/6

18/02/13

Validaciones en ASP.NET MVC

Figura 1: ModelState con un error La Figura 1 muestra la composicin del ModelState. La propiedad Keys contiene las claves (en este caso el viewmodel que estbamos usando era una clase con una propiedad cadena Nombre y un int llamado Edad) y la propiedad Values donde podemos ver, por cada clave, el valor que le ha sido asignado (Value) y la coleccin de errores (Errors). El ModelState contiene una propiedad llamada IsValid que nos dice si el modelo es correcto, es decir si no hay errores. Esa propiedad suele usarse de la siguiente forma:
[ H t t p P o s t ] p u b l i cA c t i o n R e s u l tI n d e x ( D e m o M o d e ld a t a ) { i f( ! M o d e l S t a t e . I s V a l i d ) { r e t u r nV i e w ( d a t a ) ; } e l s e { / /C o d i g on o r m a l r e t u r nV i e w ( " o k " ) ; } }

Si el ModelState no es vlido significa que alguna entrada del usuario no es correcta, por lo tanto devolvemos de nuevo la vista que contiene el formulario con los datos. Como vimos en el artculo anterior si usamos los helpers para crear el formulario, esos mostrarn los errores (en color rojo con la CSS por defecto). Si el ModelState es vlido eso significa que las entradas del usuario son correctas por lo que procedemos a realizar la accin que querramos.

Aadir nuestras validaciones


Bueno, hemos visto el mecanismo que usa el framework de MVC para indicarnos que hay algn error, el ModelState. Ahora vamos a ver cmo podemos aadir nuestras validaciones. Aunque ASP.NET MVC es muy flexible en este punto, vamos a ver la forma ms comn de hacerlo: usando DataAnnotations. En artculos posteriores veremos otras formas. Para aadir validaciones usando DataAnnotations simplemente debemos decorar la propiedad que deseemos con alguno de los atributos (algunos se encuentran en el namespace System.ComponentModel.DataAnnotations y otros en System.Web.Mvc). P.ej. si tenemos el siguiente viewmodel:
p u b l i cc l a s sD e m o M o d e l { p u b l i cs t r i n gN o m b r e{g e t ;s e t ;} p u b l i ci n tE d a d{g e t ;s e t ;} }

Si queremos que el Nombre sea obligatorio podemos decorarlo con [Required]:


p u b l i cc l a s sD e m o M o d e l { [ R e q u i r e d ] p u b l i cs t r i n gN o m b r e{g e t ;s e t ;} p u b l i ci n tE d a d{g e t ;s e t ;} }

Y listos! Solo con aadir el atributo Required, el framework sabe que el Nombre es requerido y si el usuario no lo

www.desarrolloweb.com/articulos/validaciones-aspnet-mvc-donet.html

2/6

18/02/13
entra se mostrar un error:

Validaciones en ASP.NET MVC

Figura 2: El error generado por [Required] Si comparas la Figura 2 con las capturas de pantalla del artculo anterior donde tambin se mostraban campos errneos, vers una pequea diferencia: no solo se muestra el campo de rojo, sino que tambin hay un mensaje de error. Quin aade ese mensaje de error? Pues un helper del que todava no habamos hablado: Html.ValidationMessageFor. Su uso es como lo de los helpers para generar formularios: con una expresin lambda le indicamos la propiedad para la cual queremos mostrar sus mensajes de error (si los hubiese). Ese es el cdigo completo de la vista que estamos usando:
@ u s i n g( H t m l . B e g i n F o r m ( ) ){ @ H t m l . V a l i d a t i o n S u m m a r y ( t r u e ) < f i e l d s e t > < l e g e n d > D e m o M o d e l < / l e g e n d > < d i vc l a s s = " e d i t o r l a b e l " > @ H t m l . L a b e l F o r ( m o d e l= >m o d e l . N o m b r e ) < / d i v > < d i vc l a s s = " e d i t o r f i e l d " > @ H t m l . E d i t o r F o r ( m o d e l= >m o d e l . N o m b r e ) @ H t m l . V a l i d a t i o n M e s s a g e F o r ( m o d e l= >m o d e l . N o m b r e ) < / d i v > < d i vc l a s s = " e d i t o r l a b e l " > @ H t m l . L a b e l F o r ( m o d e l= >m o d e l . E d a d ) < / d i v > < d i vc l a s s = " e d i t o r f i e l d " > @ H t m l . E d i t o r F o r ( m o d e l= >m o d e l . E d a d ) @ H t m l . V a l i d a t i o n M e s s a g e F o r ( m o d e l= >m o d e l . E d a d ) < / d i v > < p > < i n p u tt y p e = " s u b m i t "v a l u e = " C r e a t e "/ > < / p > < / f i e l d s e t > }

Otros atributos para validar


Hay varios atributos para distintas validaciones y todos se usan igual: decorando las propiedades. Si tu aplicacin exige que sus usuarios tengan entre 18 y 65 aos, se puede usar Range:
p u b l i cc l a s sD e m o M o d e l { [ R e q u i r e d ] p u b l i cs t r i n gN o m b r e{g e t ;s e t ;} [ R a n g e ( 1 8 ,6 5 ) ] p u b l i ci n tE d a d{g e t ;s e t ;} }

Ms atributos que existen: StringLength: Para limitar el nmero de caracteres de un campo texto (p.ej. el password debe tener entre 6 y 15 caracteres). Compare: Para que dos campos tengan el mismo valor (p.ej. password y repetir password) RegularExpression: Para validar contra una expresin regular Por supuesto existe la posibilidad de crearte tus propios atributos para validaciones propias pero es eso es algo que dejamos para un artculo posterior!

www.desarrolloweb.com/articulos/validaciones-aspnet-mvc-donet.html

3/6

18/02/13

Validaciones en ASP.NET MVC

Personalizar las validaciones


Si ves la Figura 2 probablemente te preguntes si es posible modificar el color que se usa para mostrar los errores y el mensaje que se muestra. La respuesta a ambas preguntas es s. Para modificar el color que se usa para mostrar los errores basta con modificar la css. Los helpers usan la clase input-validation-error para indicar que el campo de formulario est mostrando un error, as que su aspecto depende de cmo tengamos definida esa clase en la CSS. Por otro lado el mensaje que vemos es el que genera el framework por defecto, pero podemos modificarlo por uno nuestro usando la propiedad ErrorMessage que tienen todos los atributos de validacin:
p u b l i cc l a s sD e m o M o d e l { [ R e q u i r e d ( E r r o r M e s s a g e=" N a d ad ea n n i m o s . A q u t o d oe lm u n d ot i e n eu nn o m b r e ! " ) ] p u b l i cs t r i n gN o m b r e{g e t ;s e t ;} [ R a n g e ( 1 8 , 6 5 ,E r r o r M e s s a g e=" S o l om a y o r e sd ee d a dn oj u b i l a d o s " ) ] p u b l i ci n tE d a d{g e t ;s e t ;} } IMAGEN

La Figura 3 muestra el resultado con esos mensajes de error:

Figura 3: Errores con mensajes personalizados

Sumario de validaciones fallidas


Hemos visto como el helper Html.ValidationMessageFor nos permite mostrar los mensajes de error vinculados a una propiedad determinada. Pero a veces nos puede interesar mostrar un resumen con todos los mensajes de error, algo como:

Figura 4: Sumario de validaciones fallidas Pues bien, como no poda ser de otro modo existe un helper especfico para ello, llamado Html.ValidationSummary. Este helper puede generar una lista (<li>) de elementos no ordenados (<ul>) con todas las validaciones que hayan fallado. Su uso es tan simple como aadir dicho helper en el lugar donde queramos que aparezca dicha lista. Adems admite varios parmetros para personalizarlo uno de los cuales permite aadir un ttulo que se mostrar antes de la lista:
@ H t m l . V a l i d a t i o n S u m m a r y ( t r u e , " H a yv a r i o se r r o r e s : " )

La cadena "Hay varios errores:" se mostrar antes de mostrar la lista. El primer parmetro por su parte indica si la lista debe mostrar todos los errores (true) o solo aquellos que no estn vinculados a ninguna propiedad (false), es decir que sean globales a todo el viewmodel (en efecto, es posible que haya errores en el ModelState que no estn asociados a ninguna propiedad en concreto).

Validacin en cliente
Si usamos los atributos estndar (no creamos atributos propios) ya tenemos la validacin en cliente automtica. Es decir al mismo tiempo que el usuario vaya tecleando los valores o cambie el foco ya ser irn mostrando los distintos errores que haya. Si hay errores no podr enviar el formulario. Por supuesto la validacin en cliente no tiene nada que ver con la seguridad, es un tema de usabilidad (darle feedback al usuario de forma ms rpida) as que el uso de validacin en cliente no inhibe de realizarla en servidor. ASP.NET MVC la realiza siempre en servidor

www.desarrolloweb.com/articulos/validaciones-aspnet-mvc-donet.html

4/6

18/02/13

Validaciones en ASP.NET MVC

(y nosotros por nuestra parte debemos comprobar siempre el valor de la propiedad IsValid del ModelState). Si por alguna razn se desea desactivar la validacin en cliente en alguna vista, basta con llamar al mtodo Html.EnableClientValidation con el parmetro a false:
@ {H t m l . E n a b l e C l i e n t V a l i d a t i o n ( f a l s e ) ;} @ u s i n g( H t m l . B e g i n F o r m ( ) ) { / /C o d i g od e lf o r m }

Si creas atributos propios para validaciones personalizadas entontes es responsabilidad tuya asegurarte de que sean compatibles para validar en cliente (tranquilo, veremos en artculos posteriores como hacerlo), pero los que vienen, lo incluyen de serie.

Aadiendo errores propios al ModelState


Para terminar este artculo me gustara mostrar cmo podemos aadir errores propios en el ModelState. Esto puede ser til en aquellos casos en que el cdigo de validacin no pueda ser incorporado en un atributo (porque no dependa nicamente de los valores introducidos por el usuario sino que tambin dependa de factores externos). El ModelStatetiene un mtodo llamado AddModelError que sirve exactamente para esto:
[ H t t p P o s t ] p u b l i cA c t i o n R e s u l tI n d e x ( D e m o M o d e ld a t a ) { i f( M o d e l S t a t e . I s V a l i d ) { i f( M a n a g e r . E x i s t e P e r s o n a ( d a t a ) ) { M o d e l S t a t e . A d d M o d e l E r r o r ( " " ," Y ae x i s t eu n ap e r s o n ac o ne s t en o m b r e " ) ; } } i f( ! M o d e l S t a t e . I s V a l i d ) { r e t u r nV i e w ( d a t a ) ; } e l s e { / /C o d i g on o r m a l r e t u r nV i e w ( " o k " ) ; } }

En esta accin, si no hay errores en el modelo (es decir los datos introducidos por el usuario son correctos) el controlador comprueba si ya existe una persona con esos datos (usando una clase inventada Manager), y si este es el caso aade un error en el ModelState. En este momento ModelState.IsValid deja de ser true (puesto que ahora hay un error). ModelState.AddModelError tiene dos parmetros: 1. A que propiedad se asigna el error. Si vale "" no se asigna a ninguna propiedad (se entiende que es un error global que afecta a todo el viewmodel). 2. El mensaje de error asociado a dicho error. Como podemos observar el que exista el error de "Ya existe una persona con este nombre" es algo que depende de los datos introducidos pero sobretodo del estado del sistema (que exista o no ya una persona con este nombre). Estos tipos de errores son los que suelen tratarse usando AddModelError. Bueno, en este artculo nos hemos introducido en el modelo de validaciones de ASP.NET MVC. Hemos visto que es el ModelState, como usar DataAnnotations y como aadir nuestros propios errores en el ModelState. Nos han quedado varios aspectos que iremos tratando en futuros artculos como crear nuestros propios atributos de validacin y ver otros mecanismos de validacin que no sea usando atributos.

Ultimate UI Tools for MVC


www.componentone.com/webstack

MVC Scaffolding, 30 jQuery widgets Grid & HTML5 Charts for ASP.NET MVC
Compartir en redes sociales

17
Tw eet

5
Recomendar

Enviar un comentario a este artculo

www.desarrolloweb.com/articulos/validaciones-aspnet-mvc-donet.html

5/6

18/02/13
MANUAL: Manual del framework ASP.NET MVC

Validaciones en ASP.NET MVC

Helpers para formularios

Validaciones propias en ASP.NET MVC

Secciones principales Manuales FAQs Programas Directorio Videos

Monotemticos Desde cero HTML, C SS, Diseo Javascript, Ajax ASP, PHP Promocion, Ganar dinero Windows 8

Blogging Actualidad Recursos interesantes Agenda

Comunidad Perfiles pblicos Desarrolladores Vuestras pginas Registro Encuestas

C opyright | Publicidad | Acerca de | Datos legales | C ontacta

www.desarrolloweb.com/articulos/validaciones-aspnet-mvc-donet.html

6/6

También podría gustarte