2012-04-25 6 views
8

Quando si decora la proprietà di un oggetto modello con l'attributo Required e non si specifica ErrorMessage o ResourceType/Name si ottiene il messaggio di convalida nella forma interpolata di "Il campo {0} è richiesto.", Dove param 0 è il valore del Attributo DisplayName di quella proprietà.MVC3: Come modificare il testo del messaggio di convalida generico [Richiesto]?

Voglio cambiare quella stringa predefinita a qualcos'altro ma voglio mantenere la natura generica di esso, cioè non voglio specificare ErrorMessage o ResourceType/Name per ogni proprietà dell'oggetto modello. Dove è memorizzata la stringa di default e come posso cambiarla?

risposta

6

derivanti proprio attributo è una scelta giusta e probabilmente ha l'overhead più basso per iniziare, ma avrete bisogno di tornare indietro e modificare tutti i vostri impieghi attuali dei [Required]. Anche tu (e tutti gli altri membri del tuo team) dovrai ricordare di usare (e insegnare ai nuovi arrivati ​​a utilizzare) quello che sta andando avanti.

Un'alternativa è sostituire ModelMetadataProviders e ModelValidatorProviders per restituire le stringhe da un file di risorse. Questo evita gli inconvenienti di cui sopra. Inoltre, pone le basi per sostituire i messaggi per altri attributi (ad es., MaxLengthAttribute) e per supportare lingue aggiuntive.

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)); 
} 

Ecco la piena source, documentation e un blog post che descrive l'utilizzo.

6

Si è tentato di creare una classe derivata di RequiredAttribute e di eseguire l'override del metodo FormatErrorMessage? Questo dovrebbe funzionare:

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ì, ma dovrei leggere la proprietà metadata 'DisplayName' nel costruttore' MyRequiredAttribute' (invece di passarlo esplicitamente), dal momento che ho già/bisogno di DisplayName definito. –

+1

In base al link sottostante, il parametro "nome" è il nome che deve essere incluso nel messaggio formattato.http: //msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.validationattribute.formaterrormessage. aspx – Joshua

Problemi correlati