Silverlight 4中的数据验证 - 实体级验证与ViewModel验证

时间:2011-02-28 11:05:41

标签: silverlight mvvm

我正在使用Silverlight 4,MVVM,WCF RIA和Entity Framework。据我所知,有两种方法可以进行数据验证。首先是entity level validation,其次是写下validation logic in ViewModel

目前我在ViewModel中创建验证逻辑,所以我想了解各种方式的优缺点。

2 个答案:

答案 0 :(得分:2)

这有点像警察,但你最终可能需要进行两种类型的验证。

实体级别验证非常有用,因为您只需在一个位置定义它,并在将其保存到数据库之前获得UI验证消息和实体验证(假设数据正在保存到数据库中)。

问题是实体级别验证是相当基础的,您可能需要进行一些服务调用来进行自定义验证(例如,我们在创建用户表单中验证用户是否存在我们网络中提供的用户名)。这是您需要在VM中进行验证的地方。

答案 1 :(得分:2)

DataAnnotation属性也可以应用于ViewModel。但问题是一样的:

  • 在验证错误上抛出异常 - 输出窗口中的噪音
  • 为属性设置一些默认值,它会抛出异常并设置无效状态
  • 无法完全验证模型并收到所有错误。
  • 无法在代码中添加或清除错误。

与其他方式相比,优点是数据注释的简单性。

另一方面,INotifyDataErrorInfo接口允许异步执行验证。正如在其他答案中提到的,如果要检查数据库中是否已存在用户名,则可以在收到异步回调后向服务发送请求并向UI添加错误。

我更喜欢使用INotifyDataErrorInfo,虽然它需要的代码多于数据注释,但可以通过创建一种通用的验证器类来减少它:

this.Validator = new ModelValidator<ProfileViewModel>(this);
this.Validator.AddValidationFor(() => this.SelectedCountry).NotNull().Show("Select country");
this.PropertyChanged += new PropertyChangedEventHandler(this.ValidateChangedProperty);
相关问题