Saltar al contenido

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript... y lo que venga ;)

18 años online

el blog de José M. Aguilar

Inicio El autor Contactar

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web
ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript...

¡Microsoft MVP!
lunes, 22 de febrero de 2010
ASP.NET MVC 2 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 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:

Editando la entidad

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:

Añadir 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:

PropertyValueInvalid

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:

Validaciones con mensajes personalizados


Publicado en: Variable not found
Hey, ¡estoy en Twitter!

4 Comentarios:

YoKeSe dijo...

Me ha sido muy util :-)

Lau dijo...

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

josé M. Aguilar dijo...

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.

Anónimo dijo...

mira esta chebre eso pero como podria q salga un icono diciendo ese mensaje tipo un word 2003 un agente