2013-12-09 18 views
5

Nameプロパティを使用します。ASP.NET MVCでDisplayAttributeを使用してカスタム表示属性を作成する

問題は、クラスがsealedであり、いくつかのメソッドをオーバーライドするために継承できないということです。

なぜ私はこれが欲しいですか?

文字列をNameプロパティに変換するためにコードを渡したいとします。言語のプロパティを1つ追加します。

のような何か:

public class MyDisplayAttribute: DisplayAttribute // it won't work the inherits 
{ 
    public int Code { get; set; } 
    public string Language { get; set; } 

    // somewhere, I don't know what method 
    // I want to assing `Name = GetTranslation(Code, Language);` 
} 

それを行うための別の方法があります:

[MyDisplay(Code = TRANSLATION_CODE, Language = "FR-FR")] 
public string Fr { get; set; } 

そしてMyDisplayAttribute内部、私は次のようにやってみたいですか?

public class MyDisplayAttribute : DisplayNameAttribute 
    { 
     private int _code; 
     private string _language; 

     public MyDisplayAttribute(int code, string language) 
     : base(language) 
     { 
     _code = code; 
     _language = language; 
     } 

     public override string DisplayName 
     { 
     get 
     { 
      // here come LanguageTranslatorManager 
      if (_code == 1 && _language == "en") { 
       return "test"; 
      } 

      return base.DisplayName; 
     } 
     } 
    } 

とモデルに:


UPDATE

私も、この試みた私は、ビューでtestを表示するように期待してい

[MyDisplay(1, "en")] 
    public string Test 
    { 
    get; 
    set; 
    } 

を、しかし」doesnのt! 私のミスはどこですか?

+0

'DisplayNameAttribute'の機能を上書きしません。それは期待値を返しますが、メタデータにバインドしません。モデルメタデータの値を明示的に上書きする必要があります。 –

+0

あなたの質問は2年前ですので、解決策を見つけましたか? –

+0

@ChristianGollhardt:残念ながら、DisplayNameAttributeが封印されており、継承できないため、私はカスタム属性を作成しました。 –

答えて

1

プロパティの特定の表示名を設定するには、メタデータプロパティDisplayNameを設定する必要があります。カスタム属性を記述する必要がある場合は、カスタムメタデータプロバイダを作成する必要があります。あなたが提供する値に基づいて、あなたのプロパティのDisplayNameを設定する必要があります。

public class CustomModelMetadataProvider : DataAnnotationsModelMetadataProvider 
{ 
    protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, 
      Type containerType, Func<object> modelAccessor, 
      Type modelType, string propertyName) 
    { 
     var modelMetadata = base.CreateMetadata(attributes, containerType, 
       modelAccessor, modelType, propertyName); 

     if (attributes.OfType<MyDisplay>().ToList().Count > 0) 
     { 
       modelMetadata.DisplayName = GetValueFromLocalizationAttribute(attributes.OfType<MyDisplay>().ToList()[0]); 
     } 

     return modelMetadata; 
    } 

    private string GetValueFromLocalizationAttribute(MyDisplay attribute) 
    { 
      return computedValueBasedOnCodeAndLanguage; 
    } 
} 
+0

更新された質問を参照してください... –

1

あなたは間違っています。 DisplayAttributeはすでにそれが十分で独自の属性を作成しますが、表示から派生するべきではないではない場合のみ、ビルトインの.NET国際

[Display(Name = "property_name", ResourceType = typeof(MyResources))] 

を使用して「翻訳」をサポートしています。

編集:

DisplayAttributeは密閉されたクラスであるので、それを継承する方法はありません。

+0

いいえ、カスタム翻訳リソースを使用したいのですが、.netからではありません –

+3

私はOPと同じことをやろうとしていました。私の目標はDisplayAttributeを拡張して、LocalizedDisplayAttributeにResourceTypeの要素を入れ、自分のモデルで常に定義する必要がないようにすることでした。 – Snekse

関連する問題