атрибут displayname vs атрибут display


Відповіді:


69

Вони обидва дають вам ті ж результати , але ключова різниця я бачу, що ви не можете вказати ResourceTypeв DisplayNameатрибуті. Для прикладу в MVC 2, вам довелося підкласифікувати DisplayNameатрибут для надання ресурсу за допомогою локалізації. Displayатрибут (новий у MVC3 та .NET4) підтримує ResourceTypeперевантаження як властивість "поза коробкою".


1
Добре знати! Збирався реалізувати спеціальний атрибут для завантаження відображуваного значення з файлу .resx, тоді це сталося з цим питанням. Відображувальний атрибут - це шлях для розробки локалізованих додатків.
Карл Генріх Ганке

148

DisplayNameвстановлює DisplayNameметадані в моделі. Наприклад:

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

і якщо ви використовуєте у своєму поданні наступне:

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

це призведе до:

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

Display робить те саме, але також дозволяє встановити інші властивості метаданих, такі як Ім'я, Опис, ...

У Бреда Вілсона є приємна публікація в блозі, що висвітлює ці атрибути.


1
+1 - напевно, набагато корисніше мого (зараз видалено); занадто рано вранці для мене :)
Андрас Золтан

У мене виникли проблеми з PropertyDescriptor та використанням Display (ім'я .. під час виклику @ descriptor.DisplayName, він працюватиме лише за допомогою DisplayName, а не Display (ім'я).)
eaglei22

24

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

DisplayAttribute

  • визначені в System.ComponentModel.DataAnnotationsпросторі імен в System.ComponentModel.DataAnnotations.dllзбірці
  • може використовуватися в параметрах і полях
  • дозволяє встановити додаткові властивості, як DescriptionабоShortName
  • може бути локалізовано за допомогою ресурсів

DisplayNameAttribute

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

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

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

EDIT: Схоже, останнє джерело .NET Core дозволяє DisplayAttributeвикористовувати і зараз на класах.


13

Можливо, це стосується ядра .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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.