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

Silverlight 4中的数据验证-实体级验证与ViewModel验证,silverlight,mvvm,Silverlight,Mvvm,我正在使用Silverlight 4、MVVM、WCF RIA和实体框架。据我所知,有两种方法可以进行数据验证。第一个是,第二个是写下来 目前,我在ViewModel中创建了验证逻辑,因此我想知道每种方法的优缺点。这是一种逃避,但您可能最终需要进行两种类型的验证 实体级验证非常有用,因为您只需在一个位置定义它,并且在将其保存到数据库(假设数据保存到数据库)之前,您将获得UI验证消息和实体验证 问题在于实体级验证是相当基本的,您可能需要进行一些服务调用来进行自定义验证(例如,我们验证网络上存在一个

我正在使用Silverlight 4、MVVM、WCF RIA和实体框架。据我所知,有两种方法可以进行数据验证。第一个是,第二个是写下来


目前,我在ViewModel中创建了验证逻辑,因此我想知道每种方法的优缺点。

这是一种逃避,但您可能最终需要进行两种类型的验证

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


问题在于实体级验证是相当基本的,您可能需要进行一些服务调用来进行自定义验证(例如,我们验证网络上存在一个用户,该用户在我们的创建用户表单中提供了一个用户名)。这就是您需要在虚拟机中进行验证的地方。

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);
this.Validator=新的ModelValidator(this);
this.Validator.AddValidationFor(()=>this.SelectedCountry).NotNull().Show(“selectCountry”);
this.PropertyChanged+=新的PropertyChangedEventHandler(this.ValidateChangedProperty);

我不想看整个视频,所以我可以问一下,实体级验证是否与中间层实体上的数据注释验证属性相同,它们是在使用RIA时在客户端生成的?@Ben:是的,实体级验证是实体上的属性验证。如果使用实体级验证,如何向该实体的textbox绑定通知验证错误?生成属性上的setter在设置为无效值时引发异常,silverlight捕获这些异常并将控件设置为正确的可视状态。我不知道确切的细节,但它“只是工作”你如何设置它的绑定?我试图将TextBox的文本属性绑定设置为Text=“{binding MyEntity.MyProperty,…}”,但这不起作用。绑定可能会有一百万个问题。您可能需要在绑定上设置此属性以显示验证错误“NotifyOnValidationError=true”。尝试“{Binding Path=MyEntity.MyProperty…”。尝试添加带有绑定{Binding}的文本块,它将使您能够检查您是否绑定到您认为的类型。