2011-02-10 14 views
2

ASP.NET MVC 3モデルでDisplayAttributeを使用すると、文字列をハードコードするか、const stringsを含む静的クラスの文字列を参照する必要があるため、すぐに苦労します。今、以下を参照)。しかし、それでも私のためにはあまりにもです。私は何か[SimpleDisplay]などと呼ばれることになると、それは暗黙的にカスタムDataAnnotationの属性

  1. クラス名、
  2. プロパティ名それを見て、リソースの文字列を構築するだろう属性を思い付くしたい

    属性が付いています。

これは可能ですか?この

public class Product { 

[SimpleDisplay] // it will take Product and Name and do something like this Product_Name 
public string Name { get; set; } 

} 

よう

何かはこれが可能ならば、私は、を取り除くために何をしたいです:

[Display(ResourceType = typeof(Resources.Localize), Name = ResourceStrings.product_prettyid)] 
    public virtual int PrettyId 
    { 
     get; 
     set; 
    } 

    [Display(ResourceType = typeof(Resources.Localize), Name = ResourceStrings.product_name)] 
    public virtual string Title 
    { 
     get; 
     set; 
    } 

今私はそれは密封されています原因DisplayAttributeを継承することはできないことを知っています。他にどんな選択肢がありますか?それは理にかなっていますか?

答えて

5

標準の属性とカスタムを作成しようとします。DataAnnotationsModelMetadataProviderです。 CreateMetadataメソッドをオーバーライドすると、IEnumerable<Attribute>になります。あなたの属性を検索する必要があります

attributes.OfType<SimpleDisplayAttribute>().FirstOrDefault(); 

あなたが望む任意の方法でメタデータを入力してください。私はあなたが何を意味するか、正しい理解を持っている場合は

+0

ありがとうございます、これは正しい方法です。あなたのアプローチの詳細については、ここをクリックしてくださいhttp://geekswithblogs.net/brians/archive/2010/06/14/asp.net-mvc-localization-displaynameattribute-alternatives-a-better-way.aspx – mare

2

して、あなただけのこのような単純なカスタム属性を作成することがあります。

public class LocalizedDisplayNameAttribute : DisplayNameAttribute { 
    public LocalizedDisplayNameAttribute(string expression) : base(expression) { } 

    public override string DisplayName { 
     get { 
      try { 
       string[] vals = base.DisplayName.Split(','); 
       if(vals != null && vals.Length == 2) 
        return (string)HttpContext.GetGlobalResourceObject(vals[0].Trim(), vals[1].Trim()); 
      } catch {} 
      return "{res:" + base.DisplayName + "}"; 
     } 
    } 
} 

あなたは、あなたのproperiesの属性としてそれを使用することができます。 MVC HTML拡張機能はカスタム属性を取り込みます。

[LocalizedDisplayName("LBL, lbl_name1")] 
public string[] Name1 { get; set; } 
+1

何もしませんプロパティへの属性の組み込みを容易にします。実際には、パラメータがなくハードコードされたパラメータ(または厳密に型付けされたパラメータ)に依存しているため、複雑になります。 – mare