2012-04-25 10 views
8

Cuando decora la propiedad de un objeto modelo con el atributo Required y no especifica ErrorMessage o ResourceType/Name, obtiene el mensaje de validación en la forma interpolada de "Se requiere el campo {0}.", Donde param 0 es el valor del DisplayName atributo de esa propiedad.MVC3: ¿Cómo cambiar el texto del mensaje de validación [Obligatorio] genérico?

Quiero cambiar esa cadena predeterminada a otra cosa, pero quiero mantener la naturaleza genérica de la misma, es decir, no quiero especificar ErrorMessage o ResourceType/Name para cada propiedad del objeto modelo. ¿Dónde está almacenada la cadena predeterminada y cómo puedo cambiarla?

Respuesta

6

que se derivan de su propio atributo es una opción justa y probablemente tiene la menor sobrecarga para empezar, pero usted tendrá que volver atrás y cambiar todos sus usos actuales de [Required]. Usted (y cualquier otro miembro de su equipo) también deberá recordar utilizar (y enseñar a los recién llegados a usar) el correcto en el futuro.

Una alternativa es reemplazar ModelMetadataProviders y ModelValidatorProviders para devolver cadenas desde un archivo de recursos. Esto evita los inconvenientes anteriores. También sienta las bases para reemplazar mensajes por otros atributos (por ejemplo, MaxLengthAttribute) y para admitir idiomas adicionales.

protected void Application_Start() 
{ 
    var stringProvider = new ResourceStringProvider(Resources.LocalizedStrings.ResourceManager); 
    ModelMetadataProviders.Current = new LocalizedModelMetadataProvider(stringProvider); 
    ModelValidatorProviders.Providers.Clear(); 
    ModelValidatorProviders.Providers.Add(new LocalizedModelValidatorProvider(stringProvider)); 
} 

Aquí es el completo source, documentation, y una blog post que describe el uso.

6

¿Ha intentado crear una clase derivada de RequiredAttribute y anulando el método FormatErrorMessage? Esto debería funcionar:

public class MyRequiredAttribute : System.ComponentModel.DataAnnotations.RequiredAttribute 
{ 
    public override string FormatErrorMessage(string name) 
    { 
     return base.FormatErrorMessage(string.Format("This is my error for {0}", name)); 
    } 
} 
+0

Sí, pero debería leer la propiedad de metadatos 'DisplayName' en el constructor' MyRequiredAttribute' (en lugar de pasarlo explícitamente), ya que ya tengo/necesito DisplayName definido. –

+1

De acuerdo con el siguiente enlace, el parámetro 'nombre' es el nombre que se debe incluir en el mensaje formateado.http: //msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.validationattribute.formaterrormessage. aspx – Joshua

Cuestiones relacionadas