【问题标题】:Class-level validation类级验证
【发布时间】:2011-04-22 07:08:36
【问题描述】:

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

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

简而言之,我希望 RequiredAttribute 仅在满足类中的条件时才进行验证。

如何做到这一点。

更新

因为我没有找到其他方法,而且我通常不需要这个功能,所以我决定使用类级别的验证器来做粗略的方法。 那么我的问题是,有没有办法手动更新 UI 以使标题文本框带有红框,即使其无效?

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

我更喜欢 xamly 方式。

【问题讨论】:

    标签: .net wpf data-annotations validation


    【解决方案1】:

    您可以通过为类创建自定义验证属性来做到这一点。不幸的是,据我所知,分配给属性的 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 的未来版本中。

    【讨论】:

    • 这正是我所做的,问题是它不会使 Title 字段无效,我需要在 Title 属性上应用 ValidationAttribute,以便 UI 用红框将 Title TextBox 标记为无效并且所有的bs。
    • @Shimmy - 请参阅我为跨字段验证添加的链接。希望这对你有用。
    • 我决定使用 CustomValidationAttribute,它最适合我。
    【解决方案2】:

    嗯,在 MVC 中很难实现属性级别的条件验证。但是您可以扩展框架,或者您可以使用其他一些库来实现目标。我在我的项目中成功地使用 nick 的万无一失的验证来进行或有验证。你可以看看here

    【讨论】:

    • 我没有使用 ASP.NET MVC,它是一个 WPF 应用程序,但没关系。重要的是我构建了一个验证引擎,该引擎通过将 property:error 添加到字典中来使类无效,并且 UI 根据该字典中存在的内容无效,现在我希望验证错误在属性级别(标题),不在班级水平。明白了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多