Displayname 属性与 display 属性

在 ASP.NET MVC 中,DisplayName属性和 Display属性有什么不同?

150907 次浏览

DisplayName在模型元数据中设置 DisplayName,例如:

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

如果你在你的视图中使用以下内容:

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

它会产生:

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

Display具有相同的功能,但也允许您设置其他元数据属性,如 Name、 Description、 ..。

布拉德 · 威尔逊有一份 不错的博客文章报告,涵盖了这些特征。

它们都给出了相同的结果,但我看到的关键区别是,您不能在 DisplayName属性中指定 ResourceType。对于 MVC 2中的一个示例,您必须子类化 DisplayName属性以通过本地化提供资源。Display属性(MVC3和。NET4)支持 ResourceType重载作为“开箱即用”属性。

我认为目前的答案忽略了实际的重要和显著的差异,以及这对于预期的用法意味着什么。虽然它们在某些情况下都可以工作,因为实现者内置了对它们的支持,但是它们有不同的使用场景。两者都可以对属性和方法进行注释,但这里有一些重要的区别:

DisplayAttribute

  • System.ComponentModel.DataAnnotations.dll程序集的 System.ComponentModel.DataAnnotations命名空间中定义
  • 可用于参数和字段
  • 允许您设置其他属性,如 DescriptionShortName
  • 可以使用资源进行本地化

显示名称属性

  • DisplayName 位于 System.dll中的 System.ComponentModel命名空间中
  • 可用于类和事件
  • 无法使用资源进行本地化

程序集和名称空间说明了预期的用法,而本地化支持是关键。DisplayNameAttribute从那时起就存在了。NET 2,而且似乎更多地是为了在遗留属性网格中命名开发人员组件和属性,而不是为了最终用户可能需要本地化等可见的东西。

DisplayAttribute是后来在。NET 4,似乎是专门设计用来标记最终用户可见的数据类成员的,所以它更适合 DTO、实体和其他类似的东西。我觉得这是相当不幸的,他们限制它,所以它不能用于类虽然。

编辑: 看起来最新的.NETCore 源代码也允许 DisplayAttribute用于类。

也许这是专门针对。我发现 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)