2010-11-24 48 views
2

我们将所有DataAnnotations放在我们的Model类Customer上。然后,我们将Customer的一个实例作为相关ViewModel的一个属性以及一些针对Countries的查找列表,并在View中显示。迄今为止都是很好的。将DataAnnotation属性应用于Model Model中的ViewModel

然后,我们阅读SO和其他消息来源,我们不应该将我们的整个Customer模型对象传递给View,原因是仅仅为View提供最低限度的需求,更重要的是(为了我们) ModelBinding可能存在的恶意回发可能会导致问题,这些回发会添加其他信息来更改我们的模型属性,否则这些属性在视图中不可用。

我们如何从模型对象中获取所有这些DataAnnotation属性,并将可能减少的ViewModel属性放在悬崖上而不会将DRY原理抛出?

此外,我们是否认为我们不应该使用TryUpdateModel来对付我们从数据库中提取的实体?我想我们的选择是使用TryUpdateModel并传递一个排除列表的属性,这对我来说看起来并不是那么优雅,因为列表只是一个字符串类型的参数。或者,也许我们应该废除TryUpdateModel并使用类型更安全的AutoMapper之类的工具?

感谢您对这些问题的任何想法。

回答

1

我们如何将所有这些DataAnnotation属性从模型对象中移除并放到可能减少的ViewModel属性上,而不会将DRY原理扔到悬崖上?

你不行。这是付出的代价,但我认为它相当便宜,因为事实上,在这个精简版本中,验证属性可能不同,并且根据视图的要求,您可能具有不同的验证属性。我们举一个例子:NewEdit视图。在Edit视图中,将需要实体的Id,而在New视图中不需要,因为它将由数据存储分配(实际上在您的新模型中可能甚至没有Id属性)。

此外,通常我只将验证属性放在视图模型上,但这可能不是最好的方法,就好像您希望在不同的应用程序中重复使用模型一样,不会有任何验证逻辑。

此外,我们是否认为我们不应该使用TryUpdateModel来对付我们从数据库中拉出的实体?

我个人从未使用TryUpdateModel。我更喜欢将视图模型作为控制器操作参数传递,并让默认模型联编程序执行该作业。在这种情况下,您当然不需要任何包含或排除属性列表,因为此视图模型完全适合于给定的视图。

就AutoMapper而言,它是必须的工具,用于在模型类(出现在存储库方法签名中)和传递到视图中的视图模型之间进行转换。

0

我发现仅在ViewModel上放置验证属性并保持模型对象不变是最好的方法。

视图模型进行了验证,当用户帖子的任何数据,如果数据是有效的,业务层需要与用户发送的数据的数据库中创建对象模型的照顾。

在服务/业务层类,更新或添加的函数只接受对象模型(字符串,整数等)的必要值,但不会接受整个对象。服务类负责创建对象。

通过将验证放置在视图模型上,确保传递到业务逻辑层的任何和所有数据都是有效的,并且您可以安全地提交更改。