0

J'ai un objet: Voiture avec plusieurs propriétés (Marque, Modèle et Couleur). Chaque propriété a un attribut assigné (BilingualLabel).MVC 5 en utilisant Attributs sur l'objet à conduire HtmlHelper incapable de lire

J'essaye d'écrire un htmlhelper de type fort pour n'importe quel type auquel un attribut BilingualLabel est assigné. C'est à dire. Je veux me procurer le texte "MakeFR" que j'ai attribué à la propriété dans la classe Car.

E.g.

[System.AttributeUsage(AttributeTargets.Property)] 
public class BilingualLabel : System.Attribute 
{ 
    private string _resourceCode = ""; 

    public BilingualLabel(string ResourceCode) 
    { 
     _resourceCode = ResourceCode; 
    } 
} 

Puis la classe de voiture:

public class Car 
{ 
    [BilingualLabel("MakeFR")] 
    public string Make { get; set; } 

    [BilingualLabel("ModelFR")] 
    public string Model { get; set; } 

    [BilingualLabel("ColorFR")] 
    public string Color { get; set; } 

} 

semblent maintenant je viens à la classe d'aide et je ne peux pas arriver à la valeur d'attribut que je me suis fixé. J'ai montré deux des tentatives que j'ai essayées. Ils reviennent tous les deux comme des attributs vides.

public static MvcHtmlString BilingualLabelFor<T,E>(this HtmlHelper<T> htmlHelper, Expression<Func<T,E>> expression) 
    { 

     //get the Bilingual Label resource code 

     //BilingualLabel attr = 
     // (BilingualLabel)Attribute.GetCustomAttribute(typeof(E), typeof(BilingualLabel)); 

     MemberExpression member = expression.Body as MemberExpression; 
     PropertyInfo propInfo = member.Member as PropertyInfo; 


     MvcHtmlString html = default(MvcHtmlString); 

     return html; 
    } 
+0

Vos ressources statiques? Pourriez-vous utiliser les fonctionnalités intégrées pour [localisation] (http://www.codeproject.com/Articles/778040/Beginners-Tutorial-on-Globalization-and-Localizati)? – Kevin

Répondre

1

En ce moment, votre appel GetCustomAttribute tente d'obtenir un BilingualLabel hors du typeof(E) qui sera une chaîne dans votre cas. Vous devez obtenir l'attribut personnalisé basé sur le membre réel au lieu des types. En outre, si vous souhaitez obtenir la valeur que vous avez définie en dehors de l'attribut personnalisé, vous devez le définir sur une propriété publique.

attribut de mise à jour d'avoir une propriété publique:

[System.AttributeUsage(AttributeTargets.Property)] 
public class BilingualLabel : System.Attribute 
{ 
    public string ResourceCode { get; private set; } 

    public BilingualLabel(string resourceCode) 
    { 
     this.ResourceCode = resourceCode; 
    } 
} 

Ensuite, tirez GetCustomAttribute hors du membre au lieu de type:

public static MvcHtmlString BilingualLabelFor<T,E>(this HtmlHelper<T> htmlHelper, Expression<Func<T,E>> expression) 
{ 

    MvcHtmlString html = default(MvcHtmlString); 

    MemberExpression memberExpression = expression.Body as MemberExpression; 
    BilingualLabel attr = memberExpression.Member.GetCustomAttribute<BilingualLabel>(); 

    if (attr != null) 
    { 
     //Replace with actual lookup code to get Bilingual Label using attr.ResourceCode 
     html = new MvcHtmlString(attr.ResourceCode); 
    } 

    return html; 
} 
+0

Vous devez avoir de la difficulté à obtenir ce vaste cerveau de vos portes. Une excellente réponse et je vous remercie. – Proveniebam