ASP.NET MVC ModelMetadata - 当我们将属性描述为模型上的UI时,我们是否违反了关注点的分离?

时间:2011-08-17 15:00:21

标签: asp.net-mvc modelmetadata

根据这个blog post“ModelMetadata对象是使用从属性获取的数据构建的,主要来自System.ComponentModel和System.ComponentModel.DataAnnotations命名空间。”

通过将UI辅助属性放在Model对象(DisplayFormatUIHint)上,我们不是在耦合Model和View吗?

3 个答案:

答案 0 :(得分:9)

我相信。就个人而言,我保持我的模型完全不可知,我编写了ViewModels,它将在我的View中表示我的模型。然后将所有注释分配给这些ViewModel。

我认为违规行为来自于这限制了您重复使用模型的能力,因为您基本上是在模型中定义视图行为。

答案 1 :(得分:0)

我想是的。

我创建了表示浏览器和服务器之间信息交换的特定视图模型类。如果模型状态有效,那么我复制值或使用这些值调用域方法(这是Models文件夹的用途)。我从未在我的域实体上放置MVC特定属性。

经验法则,我将我的实体保存在一个单独的程序集中,对MVC一无所知。

注意在MVC操作方法中公开域实体...模型绑定器可能会给你一个坏笑话:D例如,如果你有一个“帐户”类,有一个属性“IsAdmin”并且你暴露了这个注册表单中的实体,用户可以尝试在GET字符串或POST有效负载中传递任意“IsAdmin = true”参数,MVC模型绑定器将在您的模型中设置该属性...并且您的代码可能会将该信息保存在数据库中。

因此,我认为关注视图模型非常重要。

我知道所有这些“动态”的东西,比如ViewBag,让你自己的LINQ实体成为动作方法中的参数,一切都变得非常容易......但我们不应该忽视安全性,并强制执行安全性我们必须确保只有我们想要的信息才能到达我们的域名。

干杯。

答案 2 :(得分:0)

这在很大程度上取决于你如何定义“耦合”。在某种意义上,您已将视图“耦合”到模型中:您的视图使用与模型定义的属性相同的属性。问题不在于“耦合”它是关于“什么”和“如何”。模型描述了什么(应该显示),由视图来定义如何(要做)。如果您想严格遵循此原则,则应丢弃UI提示。

如果您想更加实用,有时这些属性可以简化您的视图(通常会变得太复杂)。所以,这取决于你。

如果你想让你的模型可以重复使用(在大多数情况下这不是一个好主意,但在这里不要说教),请确保只使用在整个应用程序中一致的属性。例如,如果以相同的方式显示所有浮点数,则将DisplayFormat属性放在模型上是有意义的,而不是在视图中一次又一次地键入它,并使用枯燥的细节进行污染。

我倾向于将一般结构放在我的主视图中并将细节委托给部分,UIHint属性对我有很大帮助。称之为耦合,但好处是巨大的。