49

我从 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是因为属性的数据在页面上显示为静态(即不可编辑)文本。此页面上的数据将永远不可编辑,因此我无需Html.TextBoxFor在第二个 <div> 中使用并随后使用 将Html.LabelFor标签与该文本框正确关联。

4

4 回答 4

61

如果两个不同的视图共享同一个模型(例如,一个用于移动输出,一个是常规视图),最好将字符串放在一个位置:作为 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; }
}

我承认这个例子很做作......

这些是支持使用我能想到的属性的最佳论据。我个人的看法是,在大多数情况下,这类事情最好留给标记。

于 2012-10-04T21:00:24.810 回答
15

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

此外,您可以让 MVC 为您生成模板,Html.EditorForModel()它会为您生成正确的标签。

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

于 2012-10-04T21:05:56.610 回答
10

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

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

无论您在应用程序中使用该属性的任何位置,“狂野与疯狂”都会始终如一地出现。

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

于 2012-10-04T21:01:07.907 回答
0

还有国际化。

前段时间我用这个愚弄了。在我的模型中这样做:

[Display(Name = "XXX", ResourceType = typeof(Labels))]

我对所有资源都有一个单独的类库,所以我有 Labels.resx、Labels.culture.resx 等。

在那里我有 key = XXX, value = “在那种文化中有意义的字符串”。

于 2019-11-19T20:48:49.923 回答