ASP.NET MVC中DisplayName
属性和Display
属性有什么区别?
答案 0 :(得分:135)
DisplayName
在模型元数据中设置DisplayName
。例如:
[DisplayName("foo")]
public string MyProperty { get; set; }
如果您在视图中使用以下内容:
@Html.LabelFor(x => x.MyProperty)
它会产生:
<label for="MyProperty">foo</label>
Display
也会这样做,但也允许您设置其他元数据属性,例如名称,描述,......
Brad Wilson有nice blog post涵盖这些属性。
答案 1 :(得分:65)
他们都给你相同的结果,但我看到的关键区别是你不能在ResourceType
属性中指定DisplayName
。对于MVC 2中的示例,您必须子类化DisplayName
属性以通过本地化提供资源。 Display
属性(MVC3和.NET4中的新属性)支持ResourceType
重载作为“开箱即用”属性。
答案 2 :(得分:16)
我认为目前的答案忽略了突出实际的重要和重大差异以及这对预期用途意味着什么。虽然它们可能在某些情况下工作,因为实施者内置了对两者的支持,但它们具有不同的使用场景。两者都可以注释属性和方法,但这里有一些重要的区别:
<强> DisplayAttribute 强>
System.ComponentModel.DataAnnotations
程序集System.ComponentModel.DataAnnotations.dll
命名空间中定义
Description
或ShortName
<强> DisplayNameAttribute 强>
System.ComponentModel
System.dll
命名空间中
程序集和命名空间说明了预期的用法,本地化支持是最大的推动者。 DisplayNameAttribute
自.NET 2以来一直存在,似乎更多的是用于命名遗留属性网格中的开发人员组件和属性,而不是针对可能需要本地化等的最终用户可见的事物。
DisplayAttribute
稍后在.NET 4中引入,似乎专门用于标记最终用户可见的数据类成员,因此它更适合DTO,实体和其他东西。分类。我觉得很不幸的是他们限制了它,所以不能在课堂上使用它。
编辑:看起来最新的.NET Core源代码现在也可以在课程上使用DisplayAttribute
。
答案 3 :(得分:9)
也许这是特定于.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)