2012-09-22 42 views
21

Adición de un archivo de recursos a App_GlobalResources con una llave PropertyValueRequired y cambiando DefaultModelBinder.ResourceClassKey al nombre del archivo no tiene efecto sobre MVC 4. La cadena The {0} field is required no se cambia nunca. No quiero establecer el tipo de clase de recurso y la clave en cada campo requerido. ¿Me estoy perdiendo algo?MVC 4 ignora DefaultModelBinder.ResourceClassKey

Editar:

He hecho una pequeña modificación en el código de Darin Dimitrov para mantener las personalizaciones Obligatorio de trabajo:

public class MyRequiredAttributeAdapter : RequiredAttributeAdapter 
{ 
    public MyRequiredAttributeAdapter(
     ModelMetadata metadata, 
     ControllerContext context, 
     RequiredAttribute attribute 
    ) 
     : base(metadata, context, attribute) 
    { 
     if (attribute.ErrorMessageResourceType == null) 
     { 
      attribute.ErrorMessageResourceType = typeof(Messages); 
     } 
     if (attribute.ErrorMessageResourceName == null) 
     { 
      attribute.ErrorMessageResourceName = "PropertyValueRequired"; 
     } 
    } 
} 

Respuesta

39

Esto no es específico a ASP.NET MVC 4. Fue el lo mismo en ASP.NET MVC 3. No puede establecer el mensaje requerido usando DefaultModelBinder.ResourceClassKey, solo el PropertyValueInvalid.

Una forma de lograr lo que busca es definir una costumbre RequiredAttributeAdapter:

public class MyRequiredAttributeAdapter : RequiredAttributeAdapter 
{ 
    public MyRequiredAttributeAdapter(
     ModelMetadata metadata, 
     ControllerContext context, 
     RequiredAttribute attribute 
    ) : base(metadata, context, attribute) 
    { 
     attribute.ErrorMessageResourceType = typeof(Messages); 
     attribute.ErrorMessageResourceName = "PropertyValueRequired"; 
    } 
} 

que va a registrarse en Application_Start:

DataAnnotationsModelValidatorProvider.RegisterAdapter(
    typeof(RequiredAttribute), 
    typeof(MyRequiredAttributeAdapter) 
); 

Ahora, cuando un campo no anulable no es asignado un valor, el mensaje de error vendrá desde Messages.PropertyValueRequired donde Messages.resx se debe definir dentro de App_GlobalResources.

+0

¡Perfecto! Hice mucha investigación y no encontré nada similar. Muchas gracias. – Eduardo

+0

@DarinDimitrov, su respuesta es genial, gracias .... – RAM

+0

¿Es posible hacer algo similar para la validación de tipo, p. para las fechas? – Rowan