【问题标题】:MVVM model validation and data binding?MVVM 模型验证和数据绑定?
【发布时间】:2011-06-09 03:49:11
【问题描述】:

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

谁能推荐 MVVM 中模型验证的最佳实践是什么?验证应该在基础模型类上吗?还是在视图模型类上?

【问题讨论】:

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


    【解决方案1】:

    Silverlight 有一个名为 DataForm 的控件,它使用 DataAnnotations 属性工作,有人对port that control to WPF 非常友好。我相信这正是您正在寻找的东西。

    【讨论】:

      【解决方案2】:

      这些都是好问题!验证属于模型和视图模型。以下是我通常的处理方式:

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

      其次,我有一个实现 IDataErrorInfo 的基本 ViewModel 类。在这个基类中,我基本上询问模型是否有效,如果不是则触发错误(借助 IDataErrorInfo 很容易转换为视图)。我也把 IDataError info 的实现方法做成虚拟的,因为...

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

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

      如果您需要,请随时提出问题也给自己一些时间来解决这个问题,直到您找到适合您的方法 - 这不是一个微不足道的话题。

      HTH,
      浆果

      【讨论】:

        【解决方案3】:

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

        • 验证是针对不正确的输入 UI的第一个逻辑点是 视图模型。这是一个很好的做法 验证并停止请求 ViewModel 和不发送无效 数据到模型
        • 很多时候模型是遗留的,假设它们是 无法修改。 ViewModel 创建 一个很好的模型包装器。

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

        可以在此处找到使用 Castle 拦截器的示例 - http://www.castleproject.org/container/documentation/trunk/usersguide/interceptors.html

        【讨论】:

          【解决方案4】:

          验证逻辑放在哪里?

          软件系统大多需要某种 验证以确保 业务逻辑必须处理 只有正确的数据。这些验证 规则由业务定义 模型,所以领域层是 实施它们的正确位置。只是 请记住,您不会开始 复制验证码 业务对象。

          link

          .

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-04-27
            • 2012-12-08
            • 2013-08-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多