类级验证

时间:2010-10-07 10:27:36

标签: .net wpf data-annotations validation

我正在使用DataAnnotations utils验证一个类。

我有一个具有Title属性和Item属性的类。 我想将RequiredAttribute应用于Title属性,但仅当Item属性为null时才应该无效;如果使用对象设置Item属性,则不需要Title

简而言之,我希望RequiredAttribute只有在满足类中的条件时才能验证。

如何做到这一点。

更新

由于我没有找到其他方法,并且因为我通常不经常需要这个功能,所以我决定使用类级验证器进行粗略的处理。 我的问题是,有没有办法手动更新UI,使标题文本框具有红框,即使其无效?

更新2
我希望类级验证器在字段上进行汇总。 例如,我必须填写Cost和SalesPrice字段,我想确保SalesPrice>成本并使SalesPrice无效,否则,我不希望在类级别上出现全局验证错误。

我更喜欢用xamly的方式来做。

2 个答案:

答案 0 :(得分:6)

您可以通过为类创建自定义验证属性来执行此操作。遗憾的是,根据我的意识,分配给属性的DataAnnotation属性无法访问父类的其他属性,因此需要创建类验证器。
使用System.ComponentModel.DataAnnotations命名空间,您需要创建继承自ValidationAttribute的自定义属性类并覆盖IsValid方法(我没有测试下面的代码,但它应该让你去):

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
sealed public class CustomAttribute: ValidationAttribute
{
  public CustomAttribute()
  {
  }

  public override bool IsValid(object value)
  {
     if(value is myClass)
     {
       return ((myClass)value).Item != null &&
         string.IsNullOrEmpty(((myClass)value).Title) ? false : true;
     }
     else return true;
  }
}

进一步挖掘看来,虽然交叉现场​​验证不可能开箱即用,但可以通过扩展框架来支持它。请参阅this article for details,希望这将添加到MVC的未来版本中。

答案 1 :(得分:0)

嗯,在物业层面,在MVC中难以实现偶然验证。但你可以扩展框架,或者你可以使用其他一些库来实现目标。我成功地使用nick的万无一失的验证来进行项目中的偶然验证。你可以看看here