7

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

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

4

3 回答 3

9

我相信是这样。就我个人而言,我让我的模型完全与 ui 无关,并且我编写了 ViewModels,它将在我的视图中代表我的模型。然后将所有注解分配给这些 ViewModel。

我认为违规来自这样一个事实,即这限制了您重用模型的能力,因为您基本上是在模型中定义视图行为。

于 2011-08-17T15:27:21.143 回答
0

我认同。

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

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

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

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

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

干杯。

于 2011-08-26T17:01:29.960 回答
0

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

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

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

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

于 2011-08-28T11:24:51.760 回答