Ich weiß, das ist eine alte Frage, aber wollte ein bisschen hinzufügen. Ich befand mich in der gleichen Situation und es scheint keine Dokumentation/Blogging zu diesem Thema zu geben. Dennoch habe ich einen Weg gefunden, einen benutzerdefinierten Ressourcenanbieter mit einem Vorbehalt zu verwenden. Der Vorbehalt ist, dass ich in einer MVC-Anwendung bin, so dass ich immer noch HttpContext.GetLocalResourceObject()
zur Verfügung habe. Dies ist die Methode, mit der asp.net Elemente lokalisiert. Die Abwesenheit des Ressourcenobjekts hindert Sie nicht daran, unsere eigene Lösung zu schreiben, selbst wenn es sich um eine direkte Abfrage der DB-Tabellen handelt. Trotzdem dachte ich, dass es sich lohnt, darauf hinzuweisen.
Während ich mit der folgenden Lösung nicht sehr glücklich bin, scheint es zu funktionieren. Für jedes Validierungsattribut, das ich verwenden möchte, erben wir von diesem Attribut und überlasten das IsValid(). Die Dekoration sieht wie folgt aus:
public sealed class RequiredLocalized : RequiredAttribute {
public override bool IsValid(object value) {
if (! (ErrorMessageResourceType == null || String.IsNullOrWhiteSpace(ErrorMessageResourceName)) ) {
this.ErrorMessage = MVC_HtmlHelpers.Localize(this.ErrorMessageResourceType, this.ErrorMessageResourceName);
this.ErrorMessageResourceType = null;
this.ErrorMessageResourceName = null;
}
return base.IsValid(value);
}
}
Hinweise
- Sie müssen Ihren Code mit dem abgeleiteten Attribut schmücken, nicht der Standard:
[RequiredLocalized(ErrorMessageResourceType= typeof(ClassBeginValidated), ErrorMessageResourceName="Errors.GenderRequired")]
public string FirstName { get; set; }
Das neue Attribut wie folgt aussieht Eine
- Ich benutze ErrorMessageResourceType, um den Typ der zu validierenden Klasse zu übergeben. Damit meine ich, wenn ich in einer Kundenklasse bin und die FirstName Eigenschaft validiere, würde ich typeof (Kunde) übergeben. Ich mache das, weil ich in meinem Datenbank-Backend den vollständigen Klassennamen (Namespace + Klassenname) als Schlüssel verwende (genauso wie eine Seiten-URL in asp.net verwendet wird).
- MVC_HtmlHelpers.Localize ist nur ein einfaches Wrapper für meinen benutzerdefinierten Ressource-Anbieter
Der (halb-gestohlen) Helfer Code wie folgt aussieht ....
public static string Localize (System.Type theType, string resourceKey) {
return Localize (theType, resourceKey, null);
}
public static string Localize (System.Type theType, string resourceKey, params object[] args) {
string resource = (HttpContext.GetLocalResourceObject(theType.FullName, resourceKey) ?? string.Empty).ToString();
return mergeTokens(resource, args);
}
private static string mergeTokens(string resource, object[] args) {
if (resource != null && args != null && args.Length > 0) {
return string.Format(resource, args);
} else {
return resource;
}
}