1

我在模型中有一个 Person 类,并希望将其 15 个属性分配给视图中的标签。视图不应访问模型。这意味着控制器将处理创建人。View 是如何从 Controller 中获取这些 Person 属性的呢?如果 Controller 包含 Type Person 的成员,则 View 可以执行以下操作:

lblFirstName.Text = theController.Person.FirstName;

lblLastName.Text = theController.Person.LastName;

lblCity.Text = theController.Person.City;

但是,View 仍然是直接访问 Model(即 Person)。Controller 可以有自己的 Person 类,将 Model 的所有 Person 属性复制到其中,并具有上面的 View 使用语法。但这种设计有很多重复之处。有什么建议么?


顺便说一句,这是一个winform。该模型也是一个单独的项目/DLL。什么是 DTO?

Model 中的 Person 属性有特殊的逻辑,我不希望 View 遇到问题。例如,视图可能会:

字符串 fn = myController.Firstname;

并且由于 FirstName 属性中的逻辑而引发异常。因此,Person 对象的 Controller 轻量级(重复)版本不会有任何这些问题,因为它的属性只是字符串。

另请注意,您的 View 将需要对 Model 的引用来处理来自 Controller 的隐藏 Person 属性。我不喜欢它。

4

4 回答 4

2

稍微偏离主题(在 MVC 上),但关于您的问题的主题:

为什么不使用不那么麻烦的解决方案?如果您需要简单地为 15 个标签分配 15 个值,您可以为控制器提供一个索引属性或方法,该属性或方法使用 Label 对象的设计时名称作为键,以使用字典或实体属性名称的反射从模型中检索适当的值或一个大开关语句:

foreach(Control control in myLabelsPanel.Controls)
{
    Label label = control as Label;
    if(label != null)
    {
        label.Text = myController.TextForKey[label.Name];
    }
}

编辑:我只是忘了补充一点,我认为访问我的模型实体类的视图并不是一件坏事。毕竟,它们是模型,它们可以成为 ViewModel 的一部分(如果您正在使用该范例),并且 MVC 鼓励 View 了解模型(但不是相反)。

于 2009-01-14T01:18:18.523 回答
0

该人可能在视图数据中。我个人不认为视图访问控制器已经获得的模型类型的实例有很大的问题,所以我个人会让视图Person直接看到。

如果需要很多深层属性,例如在视图模型中,则可能需要将模型展平为person.Foo.Bar.Blip视图obj.Blip模型。

如果您正在处理单个对象,另一种选择是将每个值分别放入字典中 - 但这有点混乱。

另一种选择是滥用匿名类型;但不要这样做!我什至不会在这里重复细节,这太恶心了;但这里是

于 2009-01-13T23:49:26.270 回答
0

如果您使用DTO类,这些类是具有属性的对象,或者更严格的构造函数和一堆只读属性,您甚至可以深入分离模型中的关注点。起初它可能看起来像重复代码,但它成为处理模型预期的不同类型视图和结果的一种非常灵活的方式。

于 2009-01-13T23:51:19.837 回答
0

我不确定为什么你不能在你的视图中分享你的模型。不需要重复,而且您似乎不需要使用 DTO,所以我只需通过状态包中的 Person 就可以了。

我认为您正在更多地考虑您的服务。您不希望您的视图访问您的服务,但您的控制器会将其打包然后发送到视图。就简单的模型而言,尽管通过恕我直言发送它确实没有任何退路。唯一的另一种方法是在与您的视图相同的项目中拥有一个模型,该模型本质上是您的模型的副本,除了您要发送的值。在那种情况下,我可以看到好处,但同样......你的例子不是那么专业。

于 2009-01-13T23:55:47.707 回答