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


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

4 108

4 ответа:

они оба дают те же результаты, но ключевое отличие я вижу, что вы не можете указать 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

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

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

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

EDIT: похоже, что последний источник .NET Core позволяет DisplayAttribute для использования на классах теперь также.

возможно, это специфично для .net core, я обнаружил, что DisplayName не будет работать, но отображать (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)