MVVM模型验证和数据绑定?

时间:2011-06-09 03:49:11

标签: wpf asp.net-mvc-3 mvvm .net-4.0

在查找有关在WPF MVVM中进行属性验证的最佳实践的教程时,我看到很多人使用接口IDataErrorInfo我只是想知道是否可以像ASP中使用的那样设置自动验证。 Net MVC使用属性?

任何人都可以了解MVVM中模型验证的最佳实践吗?验证应该在基础模型类上吗?或者在视图模型类上?

4 个答案:

答案 0 :(得分:3)

Silverlight有一个名为DataForm的控件,它使用DataAnnotations属性工作,有人对port that control to WPF很友好。我认为这与你正在寻找的东西有关。

答案 1 :(得分:2)

这些都是好问题!!验证属于Model和ViewModel。以下是我通常采用的方法:

首先,我尽可能多地在模型中进行验证 - 这些规则将独立于给定的演示文稿。例如,假设您的域中的员工无效,如果它没有非空的EmployeeNumber属性,并且长度为六个字符,并且六个字符中的每一个都必须是一个数字。

其次,我有一个实现IDataErrorInfo的基础ViewModel类。在这个基类中,我基本上询问Model是否有效,如果不是则触发错误(这很容易通过IDataErrorInfo转换为View)。我还将IDataError信息的实现方法设为虚拟,因为......

最后,对于给定演示文稿,将存在模型无法捕获的边缘情况。对于(人为的)示例,假设您有一个演示文稿,其中如果只输入了他的名字和姓氏,则员工有效,而另一个则需要中间名字。虽然您当然可以并且应该在Employee中拥有FullName组件/ valueObject属性来验证该属性不为null,但是每个表示都需要一个子类ViewModel来了解Fullame属性的用户条目在这种情况下是否有效。

最后,你可以而且应该使用Validator进行模型验证 - 我喜欢NHibernateValidator,但肯定有其他(非常)好的可用。其中大多数,包括NHibernate,都将支持您正在寻找的属性验证。我更喜欢一种更清晰的属性替代方法,我在一个单独的项目中设置验证器的所有验证规则(即MyDomainImpl)。从模型中降低噪音的角度来看更清洁,以及更清晰的关注点分离。

如果你需要,请随意提问。也可以给自己一些工作时间直到你有一个适合你的方法 - 这是一个微不足道的话题。

HTH,
Berryl

答案 2 :(得分:1)

我的看法是验证应该在ViewModel而不是Model上,因为:

  • 验证用于错误输入 UI的第一个逻辑点是 视图模型。这是一个很好的做法 验证并停止请求 ViewModel并不发送无效 数据到模型
  • 很多时候,模型都是遗产,并且假设是它们 无法修改。 ViewModel创建 模型的好包装。

如果您正在为Unity,Windsor Castle等应用程序使用任何依赖注入工具,则可以使用拦截器来验证ViewModel。在调用ViewModel方法之前,首先调用拦截器。

在这里可以找到使用城堡拦截器的示例 - http://www.castleproject.org/container/documentation/trunk/usersguide/interceptors.html

答案 3 :(得分:1)

放置验证逻辑的位置?

  

软件系统大多需要某种类型   验证确保   业务逻辑必须处理   只有正确的数据。这些验证   规则由业务定义   模型等所以Domain层是   正确的地方实施它们。只是   请记住,你没有开始   复制之间的验证码   业务对象。

     

link

您可能对 WPF Application Framework (WAF) 的示例应用感兴趣。它们展示了如何将.NET DataAnnotations验证属性与MVVM模式一起使用。