MVC 4数据注释"显示"属性

Ken*_* K. 47 asp.net asp.net-mvc asp.net-mvc-4

我开始使用MVC 4(Razor视图引擎).(我相信这可能也适用于MVC 3及更早版本.)我想知道在视图中使用DisplayAttribute数据注释与直接在HTML中直接编写字符串是否有任何好处.例如,如果我有以下模型:

public class Thing
{
    public string WildAndCrazyProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

......注释财产会有什么好处:

    [Display(Name = "Wild and Crazy")]
    public string WildAndCrazyProperty { get; set; }
Run Code Online (Sandbox Code Playgroud)

......并且我的标记是:

<html>
    <body>
        <div>@Html.DisplayNameFor(modelItem => modelItem.WildAndCrazyProperty)</div>
        <div>@Html.DisplayFor(modelItem => modelItem.WildAndCrazyProperty)</div>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

...与没有注释,并做:

<html>
    <body>
        <div>Wild and Crazy</div>
        <div>@Html.DisplayFor(modelItem => modelItem.WildAndCrazyProperty)</div>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

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

eou*_*3hf 57

如果两个不同的视图共享相同的模型(例如,可能一个用于移动输出而另一个是常规的),那么将字符串驻留在单个位置可能会很好:作为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; }
}
Run Code Online (Sandbox Code Playgroud)

我承认这个例子非常人为......

这些是支持使用我可以提出的属性的最佳参数.我个人认为,在大多数情况下,这类事情最好留给加价.

  • 这就是我倾向的方式.看起来你会想要在实际显示的代码部分中更像是显示类型的东西.必须重新编译项目只是为了改变一两个标题似乎是不必要的. (4认同)
  • 所以我非常喜欢这个答案背后的概念,但它对我不起作用.我的继承类不会覆盖基类的`Display`属性.有什么理由吗? (2认同)
  • @kehrk - 这个例子不起作用.它始终从基类的定义中提取,即使属性是抽象的. (2认同)

Eri*_*sch 14

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

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

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

  • "这不像是你需要做的大量额外打字." 这不是我所关心的打字; 如果文本需要改变,那就是重新编辑.假设,如果你在一个拥有"代码隐藏"的家伙和"UI"家伙的商店怎么办?如果你不得不对标题进行更改,那么"UI"人可以(并且应该)这样做会更有意义吗? (2认同)

cod*_*biz 9

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

[Display(Name = "Wild and Crazy")]
public string WildAndCrazyProperty { get; set; }
Run Code Online (Sandbox Code Playgroud)

无论您在应用程序中使用该属性,"Wild and Crazy"都会始终显示.

有时这不灵活,因为您可能希望在某些视图中更改文本.在这种情况下,您将必须使用自定义标记,如第二个示例中所示