lunes, 22 de febrero de 2010
El sistema de validaciones integrado en ASP.NET MVC 2, basado en la especificación de restricciones utilizando los atributos definidos en el espacio de nombres
Y otra posibilidad es externalizar estos mensajes a archivos de recursos, y crear versiones localizadas de los mismos:
De esta forma, todos los atributos mediante los cuales podemos indicar restricciones del modelo permiten la especificación de un mensaje de error descriptivo.
Sin embargo, hay dos tipos de errores de validación en los que no es tan obvia la forma de indicar el texto del mensaje, debido a que no se generan por restricciones especificadas en atributos, sino basados en el tipo de la propiedad.
Por ejemplo, supongamos el siguiente código, perteneciente a una entidad de datos:
Aunque no hayamos indicado ninguna anotación que limite el contenido de sus dos propiedades, sí que existen de forma implícita dos condicionantes: el primero de ellos, que al tratarse de tipos valor no se admitirán valores nulos (o vacíos, a nivel de controles de formularios); y el segundo, que los valores introducidos deben ser convertibles a los tipos
La siguiente captura de pantalla muestra un formulario de edición de la entidad en los que se han producido estos errores de validación:
Para modificarlo basta decorar la propiedad con dicho atributo y especificar en él el contenido del mensaje, o la forma de localizar el texto en los recursos de la aplicación, de la misma forma que haríamos con un tipo referencia, como un
Dado que este código es algo anti-DRY, todavía podemos mejorarlo un poco creando nuestro propio atributo personalizado:
Para sustituir el mensaje por defecto es necesario utilizar un archivo de recursos en el que tendremos que introducir el texto que queramos utilizar en estos casos. Para ello, añadiremos en primer lugar una carpeta de recursos globales:
Y en su interior un archivo de recursos, llamado por ejemplo Mensajes.resx, en el que introducimos un string con el nombre
Observad que el interior del mensaje {0} será sustituido por el valor incorrecto, y {1} por la descripción de la propiedad que está generando el error.
El último paso para que ASP.NET MVC framework reconozca dónde debe buscar este recurso es indicar en la inicialización de la aplicación el nombre del archivo (o clase) que lo contiene:
Tras aplicar estos cambios, si ejecutamos la aplicación podremos comprobar que hemos conseguido nuestros objetivos:
Publicado en: Variable not found
Hey, ¡estoy en Twitter!
System.ComponentModel.DataAnnotations
, permite la introducción de mensajes de error personalizados, como en el siguiente ejemplo:[Range(100, 230, ErrorMessage="La altura debe estar comprendida entre {1} y {2}")]
public double Height { get; set; }
Y otra posibilidad es externalizar estos mensajes a archivos de recursos, y crear versiones localizadas de los mismos:
[Required(
ErrorMessageResourceName="CampoObligatorio",
ErrorMessageResourceType = typeof(Resources.Mensajes))]
public string Name { get; set; }
De esta forma, todos los atributos mediante los cuales podemos indicar restricciones del modelo permiten la especificación de un mensaje de error descriptivo.
Sin embargo, hay dos tipos de errores de validación en los que no es tan obvia la forma de indicar el texto del mensaje, debido a que no se generan por restricciones especificadas en atributos, sino basados en el tipo de la propiedad.
Por ejemplo, supongamos el siguiente código, perteneciente a una entidad de datos:
public class Entidad
{
public DateTime Fecha { get; set; }
public int Numero { get; set; }
}
Aunque no hayamos indicado ninguna anotación que limite el contenido de sus dos propiedades, sí que existen de forma implícita dos condicionantes: el primero de ellos, que al tratarse de tipos valor no se admitirán valores nulos (o vacíos, a nivel de controles de formularios); y el segundo, que los valores introducidos deben ser convertibles a los tipos
DateTime
e int
, respectivamente.La siguiente captura de pantalla muestra un formulario de edición de la entidad en los que se han producido estos errores de validación:
Propiedades implícitamente obligatorias
El mensaje “The XX field es required” es el texto de error por defecto para las propiedades de tipo valor, implícitamente obligatorias, y es el mismo que aparece cuando utilizamos la anotación[Required]
sin especificar ningún mensaje de validación.Para modificarlo basta decorar la propiedad con dicho atributo y especificar en él el contenido del mensaje, o la forma de localizar el texto en los recursos de la aplicación, de la misma forma que haríamos con un tipo referencia, como un
string
.public class Entidad
{
[Required(ErrorMessage = "Campo obligatorio")]
public DateTime Fecha { get; set; }
[Required(ErrorMessage = "Campo obligatorio")]
public int Numero { get; set; }
}
Dado que este código es algo anti-DRY, todavía podemos mejorarlo un poco creando nuestro propio atributo personalizado:
public class Entidad
{
[Requerido]
public DateTime Fecha { get; set; }
[Requerido]
public int Numero { get; set; }
}
public class RequeridoAttribute : RequiredAttribute
{
public RequeridoAttribute()
{
this.ErrorMessage = "Campo obligatorio";
}
}
¿Problemas con el cambio de tipo?
El otro error, “The value XX is not valid for YY”, es algo más complicado dado que no existe ningún atributo en el que podamos indicar de forma explícita el mensaje a utilizar, como hemos hecho en el caso anterior.Para sustituir el mensaje por defecto es necesario utilizar un archivo de recursos en el que tendremos que introducir el texto que queramos utilizar en estos casos. Para ello, añadiremos en primer lugar una carpeta de recursos globales:
Y en su interior un archivo de recursos, llamado por ejemplo Mensajes.resx, en el que introducimos un string con el nombre
PropertyValueInvalid
, cuyo valor será el mensaje de error que queremos mostrar cuando se produzca un error de conversión:Observad que el interior del mensaje {0} será sustituido por el valor incorrecto, y {1} por la descripción de la propiedad que está generando el error.
El último paso para que ASP.NET MVC framework reconozca dónde debe buscar este recurso es indicar en la inicialización de la aplicación el nombre del archivo (o clase) que lo contiene:
protected void Application_Start()
{
... // Otras inicializaciones
DefaultModelBinder.ResourceClassKey = "Mensajes";
}
Tras aplicar estos cambios, si ejecutamos la aplicación podremos comprobar que hemos conseguido nuestros objetivos:
Publicado en: Variable not found
Hey, ¡estoy en Twitter!
4 Comentarios:
Me ha sido muy util :-)
Hola, gracias por el post, me resulto muy explicativo :) Te consulto, ¿será que hay alguna forma de deshabilitar esa comprobación por defecto para los tipos DateTime e int? Porque esa comprobación me está dando muchos dolores de cabeza con los campos opcionales. Saludos y gracias
Hola, Lau, gracias por comentar.
Bueno, no sé si te refieres a esto, pero, ¿no te valdría con declarar las propiedades como anulables? Es decir, DateTime? e int?.
Saludos.
mira esta chebre eso pero como podria q salga un icono diciendo ese mensaje tipo un word 2003 un agente
Enviar un nuevo comentario