Атрибут отображаемого имени против атрибута отображения

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


person Ghooti Farangi    schedule 09.03.2011    source источник


Ответы (4)


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

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

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

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

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

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

это будет генерировать:

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

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

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

person Darin Dimitrov    schedule 09.03.2011
comment
+1 - наверное гораздо полезнее моего (сейчас удалено); слишком рано для меня :) - person Andras Zoltan; 09.03.2011
comment
У меня были проблемы с PropertyDescriptor и использованием Display(name.. при вызове @descriptor.DisplayName, он будет работать только с использованием DisplayName, а не Display(name..). - person eaglei22; 03.04.2017

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

Отображаемый атрибут

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

Атрибут DisplayName

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

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

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

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

person Mike Marynowski    schedule 12.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)
person mattpm    schedule 08.12.2016