В чем разница между DisplayName
атрибутом и Display
атрибутом в ASP.NET MVC?
В чем разница между DisplayName
атрибутом и Display
атрибутом в ASP.NET MVC?
Ответы:
Оба они дают одинаковые результаты, но я вижу ключевое различие в том, что вы не можете указать атрибут ResourceType
in 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
делает то же самое, но также позволяет вам устанавливать другие свойства метаданных, такие как Имя, Описание, ...
У Брэда Уилсона есть хорошая запись в блоге, посвященная этим атрибутам.
Я думаю, что в текущих ответах не уделяется внимания фактическим важным и значительным различиям и тому, что это означает для предполагаемого использования. Хотя оба они могут работать в определенных ситуациях, поскольку разработчик встроил поддержку обоих, у них разные сценарии использования. Оба могут аннотировать свойства и методы, но есть несколько важных отличий:
DisplayAttribute
System.ComponentModel.DataAnnotations
пространстве имен в System.ComponentModel.DataAnnotations.dll
сборкеDescription
илиShortName
DisplayNameAttribute
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)