我开始使用MVC 4(Razor视图引擎)。 (我相信这可能也适用于MVC 3及更早版本。)我想知道在视图中使用DisplayAttribute数据注释与直接在HTML中直接编写字符串是否有任何好处。例如,如果我有以下模型:
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
的原因是因为该属性的数据在页面上显示为静态(即不可编辑的)文本。此页面上的数据永远不可编辑,因此我无需在第二个&lt; div&gt;中使用Html.TextBoxFor
。然后使用Html.LabelFor
将标签与该文本框正确关联。
答案 0 :(得分:54)
如果两个不同的视图共享相同的模型(例如,可能一个用于移动输出,一个是常规的),那么将字符串驻留在一个位置可能会很好:作为ViewModel上的元数据。
此外,如果您的模型的继承版本需要不同的显示,那么它可能很有用。例如:
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; }
}
我承认这个例子非常人为......
这些是支持使用我可以提出的属性的最佳参数。我个人认为,在大多数情况下,这类事情最好留给标记。
答案 1 :(得分:13)
除了其他答案之外,当您想要本地化字段时,使用DisplayAttribute
会有很大的好处。您可以使用DisplayAttribute在本地化数据库中查找名称,它将使用您希望的任何翻译。
此外,您可以让MVC使用Html.EditorForModel()
为您生成模板,它会为您生成正确的标签。
归根结底,这取决于你。但是MVC非常“以模型为中心”,这就是数据属性应用于模型的原因,因此元数据存在于一个地方。这不是你需要做的大量额外打字。
答案 2 :(得分:8)
其中一个好处是您可以在多个视图中使用它并具有一致的标签文本。它也被asp.net MVC脚手架用于生成标签文本,并使生成有意义的文本更容易
[Display(Name = "Wild and Crazy")]
public string WildAndCrazyProperty { get; set; }
无论您在应用程序中使用该属性,“Wild and Crazy”都会一直显示。
有时这不灵活,因为您可能希望在某些视图中更改文本。在这种情况下,您将必须使用自定义标记,如第二个示例
答案 3 :(得分:0)
也国际化。
一段时间前,我无所事事。在我的模型中这样做了吗?
[Display(Name = "XXX", ResourceType = typeof(Labels))]
对于所有资源都有一个单独的类库。所以我有Labels.resx,Labels.culture.resx等。
无论如何,在那里我有key = XXX,value =“在这种文化中有意义的字符串”
答案 4 :(得分:-1)
我认为一种用途是您可以重命名您的财产,所有用途都会立即更新。