MVC 4数据注释“显示”属性

我开始与MVC 4(剃刀视图引擎)。 (我相信这可能适用于MVC 3和更早版本。)我想知道是否有任何好处,在视图中使用DisplayAttribute数据注释,而不是直接在HTML中写入一个string。 例如,如果我有以下模型:

public class Thing { public string WildAndCrazyProperty { get; set; } } 

在注释财产方面会有什么好处:

  [Display(Name = "Wild and Crazy")] public string WildAndCrazyProperty { get; set; } 

…有我的标记是:

 <html> <body> <div>@Html.DisplayNameFor(modelItem => modelItem.WildAndCrazyProperty)</div> <div>@Html.DisplayFor(modelItem => modelItem.WildAndCrazyProperty)</div> </body> </html> 

…与没有注释,并做:

 <html> <body> <div>Wild and Crazy</div> <div>@Html.DisplayFor(modelItem => modelItem.WildAndCrazyProperty)</div> </body> </html> 

在这种情况下,我没有提到Html.LabelFor的原因是因为该属性的数据在页面上显示为静态(即不可编辑)文本。 数据永远不能在这个页面上编辑,因此我不需要在第二个<div>中使用Html.TextBoxFor ,然后使用Html.LabelFor将标签与该文本框正确关联。

如果两个不同的视图共享相同的模型(例如,也许一个是移动输出,一个是常规的),那么将string驻留在一个地方可能会更好:作为ViewModel上的元数据。

此外,如果您有需要不同显示的模型的inheritance版本,则可能会有用。 例如:

 public class BaseViewModel { [Display(Name = "Basic Name")] public virtual string Name { get; set; } } public class OtherViewModel : BaseViewModel { [Display(Name = "Customized Inherited Name")] public override string Name { get; set; } } 

我承认这个例子很有意思

这些是支持使用我可以提出的属性的最好的论据。 我个人的看法是,大多数情况下,这样的事情最好留给标记。

除了其他答案之外,当您要本地化字段时,使用DisplayAttribute会有很大的好处。 您可以使用DisplayAttribute在本地化数据库中查找名称,并使用您希望的任何翻译。

另外,您可以让MVC使用Html.EditorForModel()为您生成模板,并为您生成正确的标签。

最终,这取决于你。 但是MVC非常“以模型为中心”,这就是数据属性应用于模型的原因,因此元数据存在于一个地方。 这不像是你必须做的大量的额外打字。

其中一个好处是你可以在多个视图中使用它,并有一个一致的标签文本。 它也被用于asp.net MVC脚手架来生成标签文本,并使生成有意义的文本更容易

 [Display(Name = "Wild and Crazy")] public string WildAndCrazyProperty { get; set; } 

无论您在应用程序中使用该属性,“Wild and Crazy”都会一致显示。

有时候这并不灵活,因为您可能想在某些视图中更改文本。 在这种情况下,你将不得不像第二个例子那样使用自定义标记