2012-05-26 18 views
5

He leído answers sobre la localización de errores de validación especificando DefaultModelBinder.ResourceClassKey, básicamente es cuando se ingresan valores de cadena en el campo int o no una fecha y hora en el campo de fecha y hora.La localización para "el valor {0} no es válido" en caso de desbordamiento int

Pero cuando estoy escribiendo "111111111111111111111111111111" para un campo int recibo System.OverflowException y se ve como "The value '{0}' is invalid.".

¿Hay alguna forma de localizar (traducir ese mensaje a otros idiomas) ese error de validación de forma similar a otra validación de MVC?

Respuesta

3

Tuve el mismo problema, y ​​finalmente logré encontrar la solución. Sí, ese mensaje puede ser localizado, y afortunadamente es bastante fácil cuando lo resuelves.

Debe crear un archivo de recursos y ponerlo en la carpeta App_GlobalResources. Puede llamar al archivo como lo desee, pero generalmente lo llamo MvcValidationMessages.

Abra el archivo de recursos y cree una cadena con el nombre InvalidPropertyValue y escriba el mensaje que desee en el campo de valor.

Ahora, abra el archivo Global.asax y añadir la siguiente línea en el método Application_Start():

System.Web.Mvc.Html.ValidationExtensions.ResourceClassKey = "MvcValidationMessages"; 

"MvcValidationMessages" por supuesto, debe ser el nombre correcto del archivo de recursos que acaba de crear.

¡Y voíla! Eso es todo al respecto. El mensaje que se muestra ahora será tuyo en lugar del predeterminado.

+0

eso es increíble, ¡gracias! Acabo de comprobar y funciona. :) – Shaddix

+0

Solo para señalarlo más fuerte ... 'System.Web.Mvc.Html.ValidationExtensions.ResourceClassKey' es el truco. ¡Gracias! – Zoka

0

que terminó anulando ModelBinder para int y el suministro de un error de mensaje localizado allí:

public class IntModelBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
     double parsedValue; 
     if (double.TryParse(value.AttemptedValue, out parsedValue)) 
     { 
      if ((parsedValue < int.MinValue || parsedValue > int.MaxValue)) 
      { 
       var error = "LOCALIZED ERROR MESSAGE FOR FIELD '{0}' HERE!!!"; 
       bindingContext.ModelState.AddModelError(bindingContext.ModelName, string.Format(error, value.AttemptedValue, bindingContext.ModelMetadata.DisplayName)); 
      } 
     } 
     return base.BindModel(controllerContext, bindingContext); 
    } 
} 

Entonces simplemente se registraron: ModelBinders.Binders.Add(typeof(int), new IntModelBinder()); y ahora funciona bien.

P.S. seguro, mis mensajes de error localizados no están codificados en la carpeta de modelo, esto es solo un ejemplo simplificado :)

Cuestiones relacionadas