ASP.Net MVC 2验证是否需要在模式和使用方面进行更多思考?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (20)

这是土地的平面。像大多数人一样,我拥有我的域对象,并拥有我的视图模型。我喜欢使用视图模型的想法,因为它允许为特定视图上下文专门创建模型,而无需更改业务对象。

我遇到的问题是在我的域对象上定义的类型级别验证,并将这些规则获取到客户端。在这种情况下,可以说我正在使用数据注释来描述验证规则,当我将数据从域对象移动到视图模型时,视图模型不再知道应该让接口执行哪些验证(因为验证是在域对象上定义)。

使用MVC 2,可以根据当前对象的验证规则自动执行客户端/服务器端验证。但是因为验证规则是在域对象而不是视图模型上定义的,所以我必须在视图模型上重复验证规则才能使其工作。

其他人如何处理这类问题?我的想法是,除了将数据从域对象映射到视图模型之外,我们还需要映射验证规则,但我没有真正看到其他人在讨论这个问题...... Brad Wilson最近讨论了这个问题但并没有真正解决域对象和视图模型的重复规则......你有什么想法?

提问于
用户回答回答于

DataAnnotation属性用于验证输入并向最终用户提供UI反馈。这是他们唯一的预期用途。我对UI对象和业务对象使用不同的验证策略,因此DA验证属性最终只会显示给用户的模型。

用户回答回答于

这可能不合适,但是如果只是将模型中的验证规则/注释移至ViewModels?在我参与的一些项目中,我们选择阻止View访问除了通过其相应ViewModel公开的信息之外的任何内容。由于所有数据交互都将通过ViewModel执行,因此不需要对Model对象进行验证。

与此观点相反的是,可以轻松地复制某些验证规则,因为不同的ViewModel可能会与相同的模型进行交互。在这种情况下,只需将Model声明为ViewModel上公开的属性就可以了。对于回发,他们可以接受一个Model作为参数,允许ModelBinder基础结构处理请求。在这种情况下,如果ModelState.IsValid为false,则可以在重新显示视图之前将该属性重新分配给ViewModel。

我会建议移动你的注释到你的ViewModels。这是有道理的,因为大量的视图是a)几个模型的组合的结果或b)模型数据的子集。

扫码关注云+社区