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