Cómo "localizar" los mensajes de error por defecto en ASP.NET MVC

ASP.NET MVC tiene la facilidad de poder establecer las reglas de validación en la definición del Modelo:

- según el tipo de datos que estemos tratando, por ejemplo, si en nuestro modelo el campo Price es un decimal, en el formulario que despleguemos no permitirá que se inserten caracteres no numéricos.

El texto de error que aparece será el que utiliza la plataforma por defecto, en inglés:

Esto siempre que tengamos definido el campo con la extensión de Validación ValidationMessageFor:

 @Html.EditorFor(model => model.Price)
 @Html.ValidationMessageFor(model => model.Price)

- también nos da la posibilidad de establecer reglas de validación mediante data annotations (metadatos) en el modelo, por ejemplo, exigir que una cadena no tenga más de un número de caracteres.

Un ejemplo es mejor que una imagen :-)

public class Album
{
 [StringLength(20, ErrorMessage="{0} no puede sobrepasar de 20 caracteres")]
 public string Title { get; set; }
 public decimal Price { get; set; }
}

Sí, eso ya lo sé, pero cómo se localizan los errores

- En el caso de utilizar data annotations, la solución es sencilla, sustituimos el texto por el siguiente código:

public class Album
{
 [StringLength(20, ErrorMessageResourceType = typeof(ErrorMessages),ErrorMessageResourceName = "LastNameTooLong"),DisplayName("Título")]
 public string Title { get; set; }
[DisplayName("Precio")]
 public decimal Price { get; set; }
}

Utilizamos ErrorMessageResourceType y dentro de typeof, indicamos el nombre de nuestro archivo resx, que deberemos crear, y el nombre de la variable del resx, en este caso "LastNameTooLong", se lo asignamos a ErrorMessageResourceName.

- Para "localizar" los textos por defecto del sistema, es solo un poco más complejo, aunque nada de rocket science.

Los pasos son:

  1. Añadir el metadato DisplayName, con lo que ya no se pintará directamente el nombre de la propiedad del Modelo.
  2. Crearemos archivo Messages.resx en nuestra carpeta App_GlobalResources, y dentro insertaremos los siguientes textos:
    Name Value
    ==== =====
    FieldMustBeDate The field {0} must be a date.
    FieldMustBeNumeric The field {0} must be a number.
    PropertyValueInvalid The value '{0}' is not valid for {1}.
    PropertyValueRequired A value is required.
  3. En Application_start dentro del Global.asax, insertaremos las siguientes líneas:
    ClientDataTypeModelValidatorProvider.ResourceClassKey = "Messages";
     DefaultModelBinder.ResourceClassKey = "Messages";
    

That's all folks! Ya solo queda compilar y listos.

Para saber más:

http://weblogs.asp.net/imranbaloch/localizing-default-error-messages-in-asp-net-mvc-and-web-form

Escrito el 12 nov 2015
comments powered by Disqus

« Cómo instalar un archivo local nupkg (de NuGet) en nuestro proyecto - Hello World en AngularJS 2 con typescript y NPM (Node.js) »