атрибут displayname против атрибута display - PullRequest
117 голосов
/ 09 марта 2011

В чем разница между атрибутом DisplayName и атрибутом Display в ASP.NET MVC?

Ответы [ 4 ]

135 голосов
/ 09 марта 2011

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

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

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

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

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

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

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

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

65 голосов
/ 24 мая 2011

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

16 голосов
/ 12 августа 2016

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

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 также и на классах.

10 голосов
/ 08 декабря 2016

Возможно, это относится к ядру .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)
...