【问题标题】:Data validation in Silverlight 4 - Entity level validation vs ViewModel validationSilverlight 4 中的数据验证 - 实体级别验证与 ViewModel 验证
【发布时间】:2011-02-28 11:05:40
【问题描述】:

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

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

【问题讨论】:

  • 我不想看整个视频,所以我可以问一下实体级验证是否与中间层实体上的数据注释验证属性相同,这些属性在您使用时生成客户端RIA?
  • @Ben:是的,实体级验证是实体的属性验证。

标签: silverlight mvvm


【解决方案1】:

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);

【讨论】:

    【解决方案2】:

    这有点麻烦,但您最终可能需要同时进行这两种类型的验证。

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

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

    【讨论】:

    • 如果您使用实体级验证,如何将验证错误通知给绑定到该实体的文本框?
    • 生成属性的设置器在设置为无效值时会引发异常,silverlight 会捕获这些异常并将控件设置为正确的视觉状态。我不知道确切的细节,但它“正常工作”
    • 你如何设置它的绑定?我尝试将 TextBox 的 Text 属性绑定设置为 Text="{Binding MyEntity.MyProperty, ... }" 但它不起作用。
    • 绑定可能存在一百万个问题。您可能需要在绑定上设置此属性以显示验证错误“NotifyOnValidationError=true”。尝试“{Binding Path=MyEntity.MyProperty...)”。尝试添加一个带有绑定 {Binding} 的 TextBlock,它可以让您检查您是否绑定到您认为的类型。
    猜你喜欢
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多