2010-03-15 11 views
8

Ich verwende Datenannotationen in einer MVC2-App und bin ein wenig entmutigt, wenn Sie versuchen, RESX-Dateiressourcen für Fehlermeldungen zu verwenden.DataAnnotations und Ressourcen spielen nicht gut

Ich habe folgendes aber halten immer die Ausnahme versucht

[Required(ErrorMessage = Resources.ErrorMessages.Required)] 
[Required(ErrorMessageResourceName = Resources.ErrorMessages.Required, 
      ErrorMessageResourceType = typeof(Resources.ErrorMessages)] 

Ich halte „Ein Attribut Argument ein konstanter Ausdruck, typeof Ausdruck oder Array-Erstellungsausdruck eines Attributs Parametertyp sein muss“, dass die Fehlermeldung bekommen es sei denn, ich ersetze ErrorMessageResourceName durch "Erforderlich" anstelle von Resources.ErrorMessages.Required.

Kann mir jemand sagen, ob ich das richtig mache?

Antwort

12

Ja, was Sie am Ende machen, ist grundsätzlich korrekt. Die ErrorMessageResourceName nimmt, was der Name impliziert, die Name einer Ressource, nicht die Ressource selbst.

Resources.ErrorMessages.Required verweist auf die tatsächliche (lokalisierte) Fehlermeldung (Ressource). Der Name der Ressource ist einfach "Erforderlich" und der Typ des Ressourcen-Managers (verwendet für ErrorMessageResourceType) ist die Klasse, die diese Ressource enthält, in diesem Fall die Klasse Resources.ErrorMessages.

So sollte Ihre Erklärung wie folgt aussehen:

[Required(ErrorMessageResourceType = typeof(Resources.ErrorMessages), 
    ErrorMessageResourceName = "Required")] 
public string Something { get; set; } 
+1

Kann ich die Errormessage-Eigenschaft verwenden, nur statt? Ich bevorzuge stark typisiert .... – devlife

+4

@devlife: Nein. Nicht, wenn Sie Lokalisierung wünschen. Genau dafür sind die Ressourceneigenschaften. Genau so ist es bei einer * beliebigen * Lokalisierung. Irgendwann in der Kette müssen Sie eine Ressourcenfolge suchen, die auf dem Namen basiert. So funktionieren externalisierte Ressourcen. Und dies ist immer noch "stark typisiert" basierend auf der Ressourcenklasse, Sie haben nur keine Kompilierungssicherheit für den Ressourcennamen selbst. Wenn Sie das wollen, erstellen Sie einfach eine Klasse wie 'ResourceNames' mit den Zeilen' public const string Erforderlich = "Erforderlich" ', dann können Sie diese als Ressourcennamen angeben. – Aaronaught