2012-04-25 6 views
8

Wenn Sie die Eigenschaft eines Modellobjekts mit dem Attribut Required dekorieren und nicht ErrorMessage oder ResourceType/Name angeben, erhalten Sie die Validierungsnachricht in der interpolierten Form "Das Feld {0} ist erforderlich.", Wobei Parameter 0 der Wert von ist DisplayName Attribut dieser Eigenschaft.MVC3: Wie ändert man den generischen [Erforderlich] Überprüfungsmeldungstext?

Ich möchte diese Standardzeichenfolge in etwas anderes ändern, aber ich möchte die generische Natur davon behalten, das heißt, ich möchte nicht für jede Eigenschaft des Modellobjekts ErrorMessage oder ResourceType/Name angeben. Wo ist der Standard-String gespeichert und wie kann ich ihn ändern?

Antwort

6

Ableitung Ihr eigenes Attribut eine faire Möglichkeit ist, und hat wahrscheinlich den geringsten Overhead zu beginnen, aber Sie werden zurück gehen müssen und alle vorhandenen Anwendungen von [Required] zu ändern. Sie (und alle anderen in Ihrem Team) müssen sich auch daran erinnern, das Richtige für die Zukunft zu verwenden (und Neulingen beizubringen).

Eine Alternative ist, die ModelMetadataProviders und ModelValidatorProviders zu ersetzen, um Zeichenfolgen aus einer Ressourcendatei zurückzugeben. Dies vermeidet die obigen Nachteile. Es legt auch die Grundlage zum Ersetzen von Nachrichten für andere Attribute (z. B. MaxLengthAttribute) und zum Unterstützen zusätzlicher Sprachen.

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

Hier ist die vollständige source, documentation und eine blog post die Verwendung beschreibt.

6

Haben Sie versucht, eine abgeleitete Klasse von RequiredAttribute zu erstellen und die FormatErrorMessage-Methode zu überschreiben? Dies sollte funktionieren:

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

Ja, aber ich sollte lesen Sie die 'DisplayName' Metadaten-Eigenschaft im' MyRequiredAttribute' -Konstruktor (anstatt es explizit übergeben), da ich bereits DisplayName definiert haben/müssen. –

+1

Laut dem folgenden Link ist der Parameter 'name' der Name, der in die formatierte Nachricht eingefügt werden soll. Http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.validationattribute.formaterrormessage. aspx – Joshua