165 votes

Attribut DisplayName de Ressources?

J'ai une application localisée, et je me demande si c'est possible d'avoir le nom d'Affichage d'un certain modèle de jeu de propriétés à partir d'une Ressource.

J'aimerais faire quelque chose comme ceci:

public class MyModel {
  [Required]
  [DisplayName(Resources.Resources.labelForName)]
  public string name{ get; set; }
}

Mais je ne peux pas, car le compilateur dit: "Un attribut argument doit être une expression constante, typeof de l'expression ou de la création de la matrice de l'expression d'un attribut de type de paramètre" :(

Existe-il des solutions? Je suis sortie d'étiquettes manuellement, mais j'ai besoin de ces pour le programme de validation de sortie!

385voto

René Points 4134

Si vous utilisez MVC 3 et .NET 4, vous pouvez utiliser le nouvel Affichage de l' attribut dans le Système.ComponentModel.DataAnnotations espace de noms. Cet attribut remplace l'attribut DisplayName et offre beaucoup plus de fonctionnalités, y compris le support de localisation.

Dans votre cas, vous pouvez l'utiliser comme ceci:

public class MyModel
{
    [Required]
    [Display(Name = "labelForName", ResourceType = typeof(Resources.Resources))]
    public string name{ get; set; }
}

Comme une note de côté, cet attribut ne fonctionnera pas avec des ressources à l'intérieur App_GlobalResources ou App_LocalResources. Cela a à voir avec l'outil spécifique (GlobalResourceProxyGenerator) ces de l'utilisation des ressources. Au lieu de cela assurez-vous que votre fichier de ressources est fixé à "Intégrée des ressources" et utiliser le 'ResXFileCodeGenerator' outil personnalisé.

(Comme une note de côté, vous ne devriez pas être à l'aide de App_GlobalResources ou App_LocalResources avec MVC. Vous pouvez lire plus au sujet de pourquoi c'est le cas ici)

114voto

Darin Dimitrov Points 528142

Comment sur l'écriture d'un attribut personnalisé:

public class LocalizedDisplayNameAttribute: DisplayNameAttribute
{
    public LocalizedDisplayNameAttribute(string resourceId) 
        : base(GetMessageFromResource(resourceId))
    { }

    private static string GetMessageFromResource(string resourceId)
    {
        // TODO: Return the string from the resource file
    }
}

ce qui pourrait être utilisée comme ceci:

public class MyModel 
{
    [Required]
    [LocalizedDisplayName("labelForName")]
    public string Name { get; set; }
}

20voto

Wahid Bitar Points 3482

Mise à jour:

Je sais que c'est trop tard, mais je tiens à ajouter cette mise à jour:

Je suis en utilisant le Modèle traditionnel Fournisseur de Métadonnées qui présenté par Phil Haacked il est plus puissant et plus facile à appliquer, prendre le regarder : ConventionalModelMetadataProvider


Vieille Réponse

Ici si vous voulez en charge de nombreux types de ressources:

public class LocalizedDisplayNameAttribute : DisplayNameAttribute
{
    private readonly PropertyInfo nameProperty;

    public LocalizedDisplayNameAttribute(string displayNameKey, Type resourceType = null)
        : base(displayNameKey)
    {
        if (resourceType != null)
        {
            nameProperty = resourceType.GetProperty(base.DisplayName,
                                           BindingFlags.Static | BindingFlags.Public);
        }
    }

    public override string DisplayName
    {
        get
        {
            if (nameProperty == null)
            {
                return base.DisplayName;
            }
            return (string)nameProperty.GetValue(nameProperty.DeclaringType, null);
        }
    }
}

Ensuite l'utiliser comme ceci:

    [LocalizedDisplayName("Password", typeof(Res.Model.Shared.ModelProperties))]
    public string Password { get; set; }

Pour la localisation complète du tutoriel, vous pouvez consulter cette page.

11voto

Magnus Karlsson Points 777

J'ai eu Gunders réponse travailler avec mon App_GlobalResources en choisissant les ressources et propriétés de l'interrupteur à "l'Outil Personnalisé" à "PublicResXFileCodeGenerator" et construire l'action de "Ressource Incorporée". Veuillez observer Gunders commentaire ci-dessous.

enter image description here

Fonctionne comme un charme :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X