Атрибут displayname с атрибутом отображения

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

Ответ 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)