为什么有[Display(AutoGenerateField = false)]和[HiddenInput(DisplayValue = false)]?

时间:2011-09-16 01:32:22

标签: asp.net-mvc-3

标题有点说明了一切。

似乎有两种方法可以使用属性将字段标记为“请勿在UI上显示”。一个存在于DataAnnotations命名空间中,这是我认为它属于的地方,另一个存在于MVC特定的命名空间System.Web.Mvc中,我认为这是错误的地方。

这意味着对于MVC应用程序,我必须使用MVC命名空间来修改我的域类,而不是使用“更通用”的ComponentModel.DataAnnotations。

有没有办法让MVC框架注意到Display()属性?

2 个答案:

答案 0 :(得分:4)

您应该在视图中使用ViewModels,而不是您域中的实体。由于ViewModel(或命令)是特定于视图的,因此它们是否具有对System.Web.x的引用并不重要。

我会调查SoC:http://en.wikipedia.org/wiki/Separation_of_concerns

Automapper / W ViewModels:http://bengtbe.com/blog/2009/04/14/using-automapper-to-map-view-models-in-asp-net-mvc/

另外,回答你的问题:

[HiddenInput(DisplayValue = false)]将呈现<input id="propId" name="propId" type="hidden" value="21" />

显示(AutoGenerateField = false)]根本不会渲染。

答案 1 :(得分:2)

虽然您应该注意Paul的答案:使用ViewModel,您的问题的常见解决方案是使用位于System.ComponentModel.DataAnnotations命名空间中的UIHint属性来装饰您的属性。

e.g。

[UIHint("Hidden")]

然后在Shared \ EditorTemplates \ Hidden.cshtml中添加一个小视图模板,如

@model object
@Html.HiddenFor( x => x)

模板名称与UIHint中给出的字符串匹配