2011-09-16 21 views
2

标题有点说这一切。为什么会出现[Display(AutoGenerateField = false)]和[HiddenInput(DisplayValue = false)]?

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

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

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

回答

2

虽然你应该真的注意到Paul的答案:使用ViewModels,你的问题的一个常见解决方案是使用驻留在System.ComponentModel.DataAnnotations命名空间中的UIHint属性来修饰你的属性。

例如

[UIHint("Hidden")] 

然后在共享添加一个小视图模板\ EditorTemplates \ Hidden.cshtml像

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

当模板的名称在UIHint

+0

谢谢@ stank-对我很好 - uihint是这个问题的宝石。如果Silverlight有类似的解决方案,您是否已经知道 – Joe

+0

? :-) – Joe

+0

对不起 - 我从来没有使用过Silverlight – StanK

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/

另外,回答你quesion:

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

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

+3

保罗喜给出的字符串相匹配 - 感谢答案,但我已经在我的视图(和automapper :-))中使用ViewModels。 在所有应有的尊重,我不得不不同意,“这是无关紧要,如果他们有一个......”。我的目标是在Silverlight项目中重新使用我的视图模型,所以更应该使用来自“通用”程序集的数据注释,而不是MVC特定的数据注释。也许它是分享虚拟机的共同梦想,但如果我们购买所有这些关注的分离,并且具有明确定义的UI /逻辑边界,那么它应该是可能的。再次,谢谢。 – Joe

相关问题