В чем разница между атрибутом DisplayName
и атрибутом Display
в ASP.NET MVC?
Атрибут отображаемого имени против атрибута отображения
Ответы (4)
Они оба дают вам одинаковые результаты, но ключевое отличие, которое я вижу, заключается в том, что вы не можете указать ResourceType
в атрибуте DisplayName
. Например, в MVC 2 вам нужно было создать подкласс атрибута DisplayName
, чтобы предоставить ресурс через локализацию. Атрибут Display
(новый в MVC3 и .NET4) поддерживает перегрузку ResourceType
как готовое свойство.
DisplayName
задает DisplayName
в метаданных модели. Например:
[DisplayName("foo")]
public string MyProperty { get; set; }
и если вы используете в своем представлении следующее:
@Html.LabelFor(x => x.MyProperty)
это будет генерировать:
<label for="MyProperty">foo</label>
Display
делает то же самое, но также позволяет вам устанавливать другие свойства метаданных, такие как имя, описание, ...
У Брэда Уилсона есть отличный пост в блоге., охватывающий эти атрибуты.
Я думаю, что текущие ответы пренебрегают выделением фактических важных и существенных различий и того, что это означает для предполагаемого использования. Хотя они оба могут работать в определенных ситуациях, потому что разработчики встроили поддержку для обоих, у них разные сценарии использования. Оба могут аннотировать свойства и методы, но есть несколько важных отличий:
Отображаемый атрибут
- определено в пространстве имен
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
и в классах.
Возможно, это связано с ядром .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)