2013-12-09 26 views
5

我想使用DisplayAttributeName屬性。在ASP.NET MVC中使用或繼承DisplayAttribute創建自定義顯示屬性

問題是該類是sealed,我無法繼承它來覆蓋一些方法。

爲什麼我要這個?

我想傳遞一些代碼以便將字符串轉換爲Name屬性。並添加一個語言屬性。

喜歡的東西:

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

而且裏面MyDisplayAttribute,我想做的事情,如:

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);` 
} 

還有另一種方式來做到這一點?


UPDATE

我也試過這樣:

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; 
     } 
     } 
    } 

,並在型號:

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

我期待,以顯示視圖test,但沒有按」 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,所以我可以將ResourceType的東西放在我的LocalizedDisplayAttribute中,而不必一直在我的模型中定義它。 – Snekse

相關問題