displayname属性vs display属性


Answers:


69

它们都给您相同的结果,但是我看到的主要区别是您不能指定ResourceTypein 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 这样做相同,但是还允许您设置其他元数据属性,例如名称,描述,...

布拉德·威尔逊(Brad Wilson)在一篇不错的博客文章中介绍了这些属性。


1
+1-可能比我的(现在已删除)有用得多;对我来说太早了:)
Andras Zoltan

我在使用PropertyDescriptor和使用Display(name ..调用@ descriptor.DisplayName时遇到问题,它将仅在使用DisplayName而不是Display(name ..)
时才起作用。– eaglei22

24

我认为当前的答案忽略了强调实际的重要差异和显着差异,以及对预期用途的含义。尽管它们都可以在某些情况下工作,因为实现者内置了对两者的支持,但是它们有不同的使用场景。两者都可以注释属性和方法,但是这里有一些重要的区别:

DisplayAttribute

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

DisplayNameAttribute

  • DisplayName在以下System.ComponentModel名称空间中System.dll
  • 可以用于课程和活动
  • 无法使用资源进行本地化

程序集和名称空间说明了预期的用法,而本地化支持则是重中之重。DisplayNameAttribute自.NET 2以来就已经存在,并且似乎更多地用于在旧版属性网格中命名开发人员组件和属性,而不是为可能需要本地化的最终用户可见的内容。

DisplayAttribute是在.NET 4中稍后引入的,并且似乎是专门为标记将最终用户可见的数据类的成员而设计的,因此它更适合DTO,实体和其他此类对象。我感到很不幸,他们限制了它,因此它不能在类中使用。

编辑:看起来最新的.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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.