El tema, que ha sido propuesto por algunos de vosotros, es sin duda muy interesante. Sea cual sea el tipo de aplicación que desarrollemos, nos vemos obligados a validar los datos de entrada y, afortunadamente, MVC 3 viene acompañado de un sistema realmente potente para ayudarnos con esta crítica tarea. De hecho, es tan amplio que no es fácil conocerlo en toda su extensión.
Y lo que voy a intentar en esta charla es dar un repaso al sistema de validación de MVC 3 completo. De esta forma podréis conocer qué es lo que hay, lo que se puede hacer, y tener una idea de cómo hacerlo. Trataremos desde aspectos muy simples como las anotaciones incluidas en el framework, su personalización y extensión, hasta temas algo más avanzadillos como la creación de validadores en cliente o los proveedores de validación. Espero que me dé tiempo a todo, uuf!
Para poder seguirla creo que es conveniente (por no decir necesario) conocer ASP.NET MVC 3 (o 2) al menos a un nivel básico; no voy a tener tiempo para detenerme en ver qué es un controlador, cómo le llegan los parámetros a la acciones, o cómo se construye un formulario. Pero tampoco es que sean unos requisitos muy exigentes: cualquiera que haya jugado mínimamente con el framework creo que podrá entenderlo todo… o al menos ese es el objetivo.
Os recuerdo que se trata de un Webcast, o sea, que podéis asistir a este evento desde vuestro sillón favorito y con un saco de palomitas a la vera, y por supuesto es totalmente gratuito. Eso sí, debéis registraros previamente para poder asistir:
- Día: martes 27 de septiembre, 19:00 hora peninsular española (GMT+1)
- URL del registro: https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032494252&Culture=es-ES
Publicado por José M. Aguilar a las 12:16 p. m.
Etiquetas: aspnetmvc, auges, charlas, eventos, validadores
Pero bueno, centrándonos en ASP.NET MVC 4, se trata de un adelanto de lo que ya se nos avanzó en el Roadmap del producto, y que se ha distribuido en dos paquetes distintos: uno para Visual Studio 2010, y otro para el flamante Visual Studio 11 Developer Preview, también lanzado durante el Build. Ambos pueden descargarse a través de Web Platform Installer, o desde los enlaces proporcionados en esta página.
Este post vamos a dedicarlo a comentar algunas de las cosas que me han ido llamando la atención durante los primeros paseos por el producto. Y ojo, que se trata de una versión muy preliminar: puede tener fallos, cambiar conforme vayamos aproximándonos a la versión final, o incluso hay características que podrían desaparecer.
Por ejemplo, en el caso de la distribución para Visual Studio 2010, no debería interferir con otras versiones del producto instaladas, por lo que deberíais poder probarla en vuestra máquina habitual sin miedo a que os rompa nada. Sin embargo, sí que me ha dado algún problemilla al compilar proyectos MVC 3 existentes, puesto que se introducían dependencias a la versión 2 de
System.Web.Webpages
(distribuida con MVC 4), pero vaya, nada que no pueda solucionarse en un par de minutos retocando las referencias del proyecto.Publicado por José M. Aguilar a las 10:17 a. m.
Etiquetas: asp.net, aspnetmvc, desarrollo, novedades
Espero que te resulten interesantes. :-)
- New Features for Web Development in Visual Studio 11 Developer Preview
Microsoft Web development tools - Tutorial: build a Mobile Website with ASP.NET MVC 4 and jQuery Mobile.
Vía Scott Hanselman - Get the scoop on the ASP.NET 4.5, ASP.NET MVC 4, ASP.NET Web Pages 2, and Visual Studio 11 Developer Previews
Jon Galloway - ASP.NET MVC 4 Developer Preview Released
Phil Haack - Probando jQuery en el escritorio de Windows 8
Gonzalo Pérez - Javascript no es tu enemigo: Patterns For Large-Scale JavaScript Application Architecture
Addi Osmani, vía Marc Rubiño - [ASP.NET vNext] Model Binding: Actualizando datos (Ya tenemos Data Annotations!)
Luis Ruiz - Estudiando el diseño de jQuery paso a paso
Carlos Benítez - Sync Framework now Open Source.
Eric Golpe - [ASP.NET vNext] Model Binding: Filtrando datos
Luis Ruiz Pavón - Volatile fields in .NET.
BlackWasp - EF vNext-Migrations - I
Unai Zorrilla - ¡Feliz día del programador!
Wikipedia - [Tip] Intellisense entre ficheros .Js
Marc Rubiño - Usando SQL Server Table-Valued Parameters en C# (mediante un Custom Iterator)
Lluis Franco - [WebCast] Mecanismos de validación en ASP.MVC 3
AUGES - Dictionary of Algorithms and Data Structures.
National Institute of Standards and Technology - Evento de ADO.NET en Second Nug.
Omar del Valle - C#/.NET Little Wonders: The String Split() and Join() methods.
James Michael - Simulating Function Overloading in #JavaScript
Joe Stagner - ¿Realmente emerge el diseño con TDD?
Josep Maria Camps. - ASP.NET page methods are only as secure as you make them
Dave Ward - Leer variables Session desde una capa de Negocios
Jesús Velasco, vía Omar del Valle.
Y no olvides que puedes seguir esta información en vivo y en directo desde Variable not found en Facebook, o a través de Twitter.
Publicado en: Variable not found
Pues bien, resulta que IE9 trae de fábrica una herramienta que nos permite reformatear el código script de una página para hacerlo más legible. Yo no lo conocía, así que aquí lo pongo por si puede ser de utilidad para alguien más.
Lo único que hay que hacer es acceder a la pestaña “Script” de las Developer Tools, desplegar el menú de herramientas y marcar la opción “Formato Javascript”:
Y ahí lo tenemos:
Obviamente no hace milagros; si se han utilizado técnicas de ofuscación o se han modificado los nombres de funciones y variables vamos a seguir teniéndolos igual, pero algo es algo…
Publicado en: Variable not found.
Publicado por José M. Aguilar a las 9:29 a. m.
Etiquetas: depuración, desarrollo, ie, javascript, trucos
A raíz de dicho post, el amigo Héctor S. (¡gracias!) me envió una interesante pregunta: ¿por qué no utilizar la anotación
System.ComponentModel.DataAnnotations.
EnumDataType
para ello? Y la respuesta corta es: pues también se podría. Con sus particularidades, pero sería posible controlar los valores de entrada a un
enum
usando esta anotación.Empecemos por el principio.
EnumDataTypeAttribute
es una anotación introducida en .NET 4 que nos permite indicar que una propiedad (no necesariamente de tipo enum
) admite exclusivamente valores definidos en un enumerado. Mejor lo vemos con algo de código: public enum Sexo
{
Hombre = 1,
Mujer = 2
}
[EnumDataType(typeof(Sexo))]
public int Sexo { get; set; }
En el ejemplo anterior observamos una propiedad
Sexo
de tipo int
, lo que le permite virtualmente alojar cualquier valor entero posible. Sin embargo, el hecho de decorarla con el atributo EnumDataTypeAttribute
y asociarla a la enumeración Sexo
hará que en la validación de la entidad su valor sea considerado incorrecto si éste no pertenece a los permitidos en ella, en este caso, 1 y 2.Su uso es interesante, por ejemplo, como método para acercar representaciones de la información. Por ejemplo, si la propiedad
Sexo
está mapeada hacia un campo de base de datos, es bastante habitual que éste sea de tipo entero, por lo que el hecho de declararla en la entidad como int
facilita el movimiento de datos entre uno y otro. Al decorarla con EnumDataType
lo que hacemos simplemente es asegurar que contendrá un valor correcto conforme al enumerado, pero ojo, siempre que la entidad sea validada considerando sus anotaciones (como ocurre durante el binding).Y volviendo al tema del post, entonces, ¿por qué no utilizamos este método para asegurar la validez de los datos en el post al que hacía referencia, en lugar de montar un binder personalizado?
Pues el motivo principal sería la pereza. Realmente, me parece demasiado trabajoso el tener que decorar cada propiedad
enum
del modelo con una declaración tan redundante como la siguiente: public class Persona
{
public string Nombre { get; set; }
[EnumDataType(typeof(Sexo))]
public Sexo Sexo { get; set; }
...
}
A ver, si estoy declarando una propiedad de tipo
Sexo
, me resulta pesado tener que decirle algo más arriba que ésta es un tipo de datos enumerado de tipo Sexo
.Pero bueno, salvando este incómodo detalle,
EnumDataType
es una buena fórmula para controlar la corrección de los valores de entrada, y sobre todo muy cómoda si la propiedad parámetro a actualizar es de un tipo no enum
, como un int
:. [EnumDataType(typeof(Sexo))]
public int Sexo { get; set; }
Su uso aporta, además, otras posibilidades interesantes. Por ejemplo, sería posible crear editores personalizados sobre el tipo
int
que, basándose en este atributo, mostraran a nivel de vista desplegables u otros controles de selección de forma automática.Es importante tener en cuenta que, a diferencia de mi enfoque, la comprobación del atributo se realiza durante el proceso de validación, que es posterior al binding en sí. La ventaja de esto es que se integra de forma natural en dicho proceso (por ejemplo, ModelState.IsValid retornará falso si hemos intentado introducir un "3" en Sexo), pero también pueden producirse errores previos generados por el propio binder si no es capaz de realizar la transformación de forma automática (por ejemplo, al intentar un valor textual no presente en la enumeración, como 'Gato'), que de la otra forma sí sería posible controlar.
Publicado en: Variable not found.