атрибут displayname vs атрибут display


Ответы:


69

Оба они дают одинаковые результаты, но я вижу ключевое различие в том, что вы не можете указать атрибут ResourceTypein DisplayName. Например, в MVC 2 вам нужно DisplayNameбыло создать подкласс атрибута для предоставления ресурса через локализацию. DisplayАтрибут (новый в MVC3 и .NET4) поддерживает ResourceTypeперегрузку как свойство "из коробки".


1
Хорошо знать! Собирался реализовать настраиваемый атрибут для загрузки отображаемого значения из файла .resx, а затем возник по этому вопросу. Атрибут отображения - это лучший способ разработки локализованных приложений.
Carl Heinrich Hancke

148

DisplayNameустанавливает DisplayNameв метаданных модели. Например:

[DisplayName("foo")]
public string MyProperty { get; set; }

и если вы используете в своем представлении следующее:

@Html.LabelFor(x => x.MyProperty)

это сгенерирует:

<label for="MyProperty">foo</label>

Display делает то же самое, но также позволяет вам устанавливать другие свойства метаданных, такие как Имя, Описание, ...

У Брэда Уилсона есть хорошая запись в блоге, посвященная этим атрибутам.


1
+1 - наверное, гораздо более полезный, чем мой (сейчас удален); слишком рано для меня утром :)
Андраш Золтан

У меня были проблемы с PropertyDescriptor и с использованием Display (name .. при вызове @ descriptor.DisplayName, он будет работать только с DisplayName, а не Display (name ..).
eaglei22 03

24

Я думаю, что в текущих ответах не уделяется внимания фактическим важным и значительным различиям и тому, что это означает для предполагаемого использования. Хотя оба они могут работать в определенных ситуациях, поскольку разработчик встроил поддержку обоих, у них разные сценарии использования. Оба могут аннотировать свойства и методы, но есть несколько важных отличий:

DisplayAttribute

  • определено в System.ComponentModel.DataAnnotationsпространстве имен в System.ComponentModel.DataAnnotations.dllсборке
  • может использоваться в параметрах и полях
  • позволяет вам установить дополнительные свойства, такие как DescriptionилиShortName
  • можно локализовать с помощью ресурсов

DisplayNameAttribute

  • DisplayName находится в System.ComponentModelпространстве имен вSystem.dll
  • можно использовать на занятиях и мероприятиях
  • не может быть локализован с помощью ресурсов

Сборка и пространство имен говорят о предполагаемом использовании, а поддержка локализации - большой удар. DisplayNameAttributeсуществует с .NET 2 и, похоже, был предназначен больше для именования компонентов и свойств разработчика в устаревшей сетке свойств, а не столько для вещей, видимых конечным пользователям, которые могут нуждаться в локализации и т.

DisplayAttributeбыл представлен позже в .NET 4 и, по-видимому, разработан специально для маркировки членов классов данных, которые будут видны конечному пользователю, поэтому он больше подходит для DTO, сущностей и других подобных вещей. Мне очень жаль, что они ограничили его, поэтому его нельзя использовать в классах.

РЕДАКТИРОВАТЬ: похоже, что последний исходный код .NET Core DisplayAttributeтеперь также можно использовать в классах.


13

Возможно, это характерно для ядра .net, я обнаружил, что DisplayName не работает, а Display (Name = ...) работает. Это может спасти кого-то еще от устранения неполадок :)

//using statements
using System;
using System.ComponentModel.DataAnnotations;  //needed for Display annotation
using System.ComponentModel;  //needed for DisplayName annotation

public class Whatever
{
    //Property
    [Display(Name ="Release Date")]
    public DateTime ReleaseDate { get; set; }
}


//cshtml file
@Html.DisplayNameFor(model => model.ReleaseDate)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.