2013-12-09 8 views
5

chcę korzystać z DisplayAttributeName nieruchomości.Utwórz niestandardowy atrybut wyświetlacza za pomocą przycisków lub dziedziczy DisplayAttribute w ASP.NET MVC

Problemem jest to, że klasa jest sealed i nie mogę go zastąpić dziedziczy kilka metod.

Dlaczego chcę to?

Chcę przekazać trochę kodu w celu przełożenia struny do Name nieruchomości. I dodaj jedną właściwość dla języka.

Coś jak:

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

A wewnątrz MyDisplayAttribute, chcę zrobić jak:

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

Jest też inny sposób to zrobić?


UPDATE

Próbowałem też to:

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

oraz w modelu

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

Czekam, aby wyświetlić test w widoku, ale nie robi” t! Gdzie jest mój błąd?

+0

Nie zastępuje funkcji "DisplayNameAttribute". Zwraca oczekiwaną wartość, ale nie wiąże jej z metadanymi. Musisz jawnie nadpisać wartość w metadanych modelu. –

+0

Skoro twoje pytanie jest 2 lata temu, czy znalazłeś rozwiązanie tego problemu? –

+0

@ChristianGollhardt: Niestety nie, stworzyłem mój atrybut niestandardowy, ponieważ DisplayNameAttribute jest zapieczętowany i nie może być dziedziczony. –

Odpowiedz

1

Aby ustawić konkretną nazwę wyświetlaną dla nieruchomości, trzeba ustawić właściwość metadanych DisplayName. Jeśli chcesz pisać niestandardowe atrybuty, upewnij się, że utworzyłeś niestandardowego dostawcę metadanych. Wewnątrz musisz ustawić wartość DisplayName swojej właściwości na podstawie podanych wartości.

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

Zobacz moją zaktualizowaną pytanie ... –

1

Robisz to źle. DisplayAttribute już obsługuje „tłumaczenia” za pomocą wbudowanego w .NET internacjonalizacji

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

Tylko jeśli to nie wystarczy, należy utworzyć własny atrybut, ale nie wynikające z wyświetlaczem.

Edit:

DisplayAttribute jest szczelna klasy, więc nie ma sposobu, aby dziedziczą z niego.

+0

Nie, chcę wykorzystać moje tłumaczenia własnych zasobów, a nie od .net –

+3

starałem się zrobić to samo jak PO. Moim celem było rozszerzenie DisplayAttribute tak, aby móc umieścić rzeczy ResourceType w mojej LocalizedDisplayAttribute i nie muszę ich cały czas definiować w moich modelach. – Snekse

Powiązane problemy