Ich habe eine lokalisierte Anwendung und frage mich, ob es möglich ist, die DisplayName
Eigenschaft für ein bestimmtes Modell aus einer Ressource festzulegen.
Ich möchte so etwas machen:
public class MyModel {
[Required]
[DisplayName(Resources.Resources.labelForName)]
public string name{ get; set; }
}
Aber ich kann es nicht, wie der Compiler sagt: "Ein Attributargument muss ein konstanter Ausdruck, ein Ausdruckstyp oder ein Arrayerstellungsausdruck eines Attributparametertyps sein" :(
Gibt es Problemumgehungen? Ich gebe Etiketten manuell aus, aber ich benötige diese für die Validatorausgabe!
c#
asp.net-mvc
localization
resources
resx
Palantir
quelle
quelle
Wenn Sie MVC 3 und .NET 4 verwenden, können Sie das neue
Display
Attribut imSystem.ComponentModel.DataAnnotations
Namespace verwenden. Dieses Attribut ersetzt dasDisplayName
Attribut und bietet viel mehr Funktionen, einschließlich Lokalisierungsunterstützung.In Ihrem Fall würden Sie es folgendermaßen verwenden:
Nebenbei bemerkt, dieses Attribut funktioniert nicht mit Ressourcen innerhalb
App_GlobalResources
oderApp_LocalResources
. Dies hat mit dem benutzerdefinierten Tool (GlobalResourceProxyGenerator
) zu tun, das diese Ressourcen verwenden. Stellen Sie stattdessen sicher, dass Ihre Ressourcendatei auf "Eingebettete Ressource" eingestellt ist, und verwenden Sie das benutzerdefinierte Tool "ResXFileCodeGenerator".(Als weitere Randnotiz sollten Sie MVC nicht verwenden
App_GlobalResources
oder verwendenApp_LocalResources
. Weitere Informationen dazu, warum dies hier der Fall ist, finden Sie hier. )quelle
Name = "labelForName"
auch verwendenName = nameof(Resources.Resources.labelForName)
.Wenn Sie Ihre Ressourcendatei öffnen und den Zugriffsmodifikator in "öffentlich" oder "intern" ändern, wird aus Ihrer Ressourcendatei eine Klasse generiert, mit der Sie stark typisierte Ressourcenreferenzen erstellen können.
Das heißt, Sie können stattdessen so etwas tun (mit C # 6.0). Dann müssen Sie sich nicht mehr daran erinnern, ob der Vorname in Kleinbuchstaben oder Kamel geschrieben war. Und Sie können sehen, ob andere Eigenschaften denselben Ressourcenwert verwenden, indem Sie alle Referenzen finden.
quelle
Aktualisieren:
Ich weiß, dass es zu spät ist, aber ich möchte dieses Update hinzufügen:
Ich verwende den konventionellen Modell-Metadaten-Anbieter, der von Phil Haacked vorgestellt wurde. Er ist leistungsfähiger und einfacher anzuwenden. Sehen Sie sich das an: ConventionalModelMetadataProvider
Alte Antwort
Hier, wenn Sie viele Arten von Ressourcen unterstützen möchten:
Dann benutze es so:
Das vollständige Tutorial zur Lokalisierung finden Sie auf dieser Seite .
quelle
Ich habe die Antwort von Gunders erhalten, die mit meinen App_GlobalResources arbeitet, indem ich die Ressourceneigenschaften ausgewählt und "Benutzerdefiniertes Tool" auf "PublicResXFileCodeGenerator" umgeschaltet und die Aktion auf "Eingebettete Ressource" erstellt habe. Bitte beachten Sie den Kommentar von Gunders unten.
Klappt wunderbar :)
quelle
Definieren Sie den Namen des Attributs, das für den Schlüssel der Ressource verwendet wird. Nach C # 6.0 können Sie eine
nameof
stark typisierte Unterstützung verwenden, anstatt den Schlüssel fest zu codieren.Stellen Sie die Kultur des aktuellen Threads in der Steuerung ein.
Resource.Culture = CultureInfo.GetCultureInfo("zh-CN");
Stellen Sie die Zugänglichkeit der Ressource für öffentlich ein
Zeigen Sie das Etikett wie folgt in cshtml an
@Html.DisplayNameFor(model => model.Age)
quelle