J'ai une application localisée, et je me demande s'il est possible d'avoir la DisplayName
propriété pour un certain modèle définie à partir d'une ressource.
J'aimerais faire quelque chose comme ça:
public class MyModel {
[Required]
[DisplayName(Resources.Resources.labelForName)]
public string name{ get; set; }
}
Mais je ne peux pas le faire, comme le dit le compilateur: "Un argument d'attribut doit être une expression constante, une expression de type ou une expression de création de tableau d'un type de paramètre d'attribut" :(
Existe-t-il des solutions de contournement? Je produis des étiquettes manuellement, mais j'en ai besoin pour la sortie du validateur!
c#
asp.net-mvc
localization
resources
resx
Palantir
la source
la source
Si vous utilisez MVC 3 et .NET 4, vous pouvez utiliser le nouvel
Display
attribut dans l'System.ComponentModel.DataAnnotations
espace de noms. Cet attribut remplace l'DisplayName
attribut et fournit beaucoup plus de fonctionnalités, y compris la prise en charge de la localisation.Dans votre cas, vous l'utiliseriez comme ceci:
En remarque, cet attribut ne fonctionnera pas avec les ressources à l'intérieur
App_GlobalResources
ouApp_LocalResources
. Cela a à voir avec l'outil personnalisé (GlobalResourceProxyGenerator
) que ces ressources utilisent. Assurez-vous plutôt que votre fichier de ressources est défini sur «Ressource intégrée» et utilisez l'outil personnalisé «ResXFileCodeGenerator».(En guise de remarque supplémentaire, vous ne devriez pas utiliser
App_GlobalResources
ouApp_LocalResources
avec MVC. Vous pouvez en savoir plus sur les raisons pour lesquelles c'est le cas ici )la source
Name = "labelForName"
vous pouvez également utiliserName = nameof(Resources.Resources.labelForName)
.Si vous ouvrez votre fichier de ressources et changez le modificateur d'accès en public ou en interne, il générera une classe à partir de votre fichier de ressources qui vous permettra de créer des références de ressources fortement typées.
Ce qui signifie que vous pouvez faire quelque chose comme ça à la place (en utilisant C # 6.0). Ensuite, vous n'avez pas à vous rappeler si le prénom était en minuscules ou en camelcas. Et vous pouvez voir si d'autres propriétés utilisent la même valeur de ressource avec une recherche de toutes les références.
la source
Mettre à jour:
Je sais qu'il est trop tard mais j'aimerais ajouter cette mise à jour:
J'utilise le fournisseur de métadonnées de modèle conventionnel qui, présenté par Phil Haacked , est plus puissant et facile à appliquer, regardez-le: ConventionalModelMetadataProvider
Ancienne réponse
Ici, si vous souhaitez prendre en charge de nombreux types de ressources:
Ensuite, utilisez-le comme ceci:
Pour le didacticiel de localisation complet, consultez cette page .
la source
J'ai obtenu la réponse de Gunders en travaillant avec mon App_GlobalResources en choisissant les propriétés des ressources et en basculant «Outil personnalisé» en «PublicResXFileCodeGenerator» et en construisant l'action en «Ressource intégrée». Veuillez observer le commentaire de Gunders ci-dessous.
Fonctionne comme un charme :)
la source
Définissez le nom de l'attribut utilisé pour la clé de la ressource, après C # 6.0, vous pouvez l'utiliser
nameof
pour une prise en charge forte au lieu de coder en dur la clé.Définissez la culture du thread actuel dans le contrôleur.
Resource.Culture = CultureInfo.GetCultureInfo("zh-CN");
Définir l'accessibilité de la ressource au public
Affichez l'étiquette dans cshtml comme ceci
@Html.DisplayNameFor(model => model.Age)
la source