这是这片土地的基本情况。像大多数人一样,我有自己的域对象和视图模型。我喜欢使用视图模型的想法,因为它允许专门为给定的视图上下文创建模型,而不需要更改我的业务对象。
我遇到的问题是在我的域对象上定义的类型级别验证,并将这些规则发送到客户端。在这种情况下,假设我使用数据注释来描述验证规则,当我将数据从域对象移动到视图模型时,视图模型不再知道它应该让接口执行什么验证(因为验证是在域对象上定义的)。
使用MVC2,您可以让它根据当前对象的验证规则自动执行客户端/服务器端验证。但是因为验证规则是在域对象上定义的,而不是在视图模型上定义的,所以我必须在视图模型上复制验证规则才能使其正常工作。
其他人是如何处理这类问题的?我的想法是,除了将数据从域对象映射到视图模型之外,我们还需要跨验证规则进行映射,但我还没有看到其他人讨论这个问题……Brad Wilson最近详细讨论了这个问题,但并没有真正解决域对象和视图模型上的规则重复问题……你的想法是什么?
干杯安东尼
发布于 2010-02-07 01:48:06
DataAnnotation属性用于验证输入并向最终用户提供UI反馈。这实际上是它们唯一的预期用途。我对UI对象和业务对象使用不同的验证策略,因此DA验证属性最终只显示在向用户显示的模型上。
发布于 2010-02-02 16:07:24
这可能并不合适,但是如果您只是将验证规则/注释从您的模型移动到您的ViewModels中呢?在我参与的几个项目中,我们选择了阻止视图访问通过其对应的ViewModel公开的信息以外的任何内容。由于所有数据交互都将通过ViewModel执行,因此不需要对模型对象进行验证。
这个论点的反面是,您可以很容易地复制某些验证规则,因为不同的ViewModels可能与相同的模型接口。在这种情况下,简单地将模型声明为在ViewModel上公开的属性可能是有意义的。对于回发,它们可以接受模型作为其参数,从而允许ModelBinder基础结构处理请求。在这种情况下,如果ModelState.IsValid为false,则只需在重新显示视图之前将属性重新分配给ViewModel即可。
我建议您将注释移动到您的ViewModels。这是有意义的,因为许多视图是a)几个模型组合的结果,或者b)模型数据的子集。
发布于 2010-02-20 19:09:19
事实证明,AutoMapper可能能够自动为我们做这件事,这是最好的情况。
AutoMapper-用户:将验证属性传输到视图模型?
我还没有抽出时间尝试那里提出的解决方案,但打算很快就会。
(Cross也在我的(dupe)问题上发布了这一点)。
https://stackoverflow.com/questions/2181940
复制相似问题