2013-12-09 1 views
5

Я хочу использовать DisplayAttribute с Name.Создайте собственный атрибут отображения, используя или наследующий DisplayAttribute в ASP.NET MVC

Проблема в том, что класс 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))] 

Только если это не достаточно, то вы должны создать свой собственный атрибут, но не вытекающих из дисплея.

Edit:

DisplayAttribute закрытый класс, так что нет никакого способа, чтобы наследовать от него.

+0

Нет, я хочу использовать свои собственные ресурсы перевода, а не из .net –

+3

Я пытался сделать то же самое, что и OP. Моя цель состояла в том, чтобы расширить DisplayAttribute, чтобы я мог поместить материал ResourceType в свой LocalizedDisplayAttribute и не должен постоянно определять его в моих моделях. – Snekse

Смежные вопросы