【问题标题】:Data annotation validation attribute - mandatory set (i.e. one of many is required)数据注释验证属性 - 强制集(即需要其中之一)
【发布时间】:2014-02-04 09:38:19
【问题描述】:

我们希望使用数据注释验证属性来表示在某个属性集中至少需要一个。

例如:

class X
{
    [Set("Set1", Validation=typeof(RequiredAttribute))]
    public string A { get; set; }

    [Set("Set1", Validation=typeof(RequiredAttribute))]
    public string B { get; set; }
}

这意味着必须设置AB。类似的东西已经存在了吗?

如果没有,您是否有机会在自定义数据注释验证属性中访问要验证的对象的父对象,以便我们自己完成?目前我们只能得到AB 中的一个,没有机会联系到另一个。

【问题讨论】:

    标签: c# validation data-annotations


    【解决方案1】:

    你可以,但不是那样。您需要使您的类成为 IValidatableObject 接口的一部分(它也来自 DataAnnotations 命名空间)。

    然后您可以实现一个验证功能,您可以在其中使用自己的业务逻辑检查有效性。

    注意:Validate 方法的名称和签名是固定的,因为它们来自接口。

    public class Actor : AbstractDataholder, IValidatableObject
    {
        public string A { get; set; }
        public string B { get; set; }
    
        public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {
            if(string.IsnullorWhiteSpace(this.A) && string.IsnullorWhiteSpace(this.B))
                 return new ValidationResult("NOT VALID");            
        }
    }
    

    【讨论】:

    • 谢谢。这是我们当前的变通解决方案,但是,我们希望将这个概念概括为一个属性,以实现良好的代码重用。
    • 这个解决方案很容易出错,因为你很容易弄乱 if 语句。
    • 是的。但是您可以创建一个派生自 IValidatableObject 的新类,实现更通用的 Validate,并将该派生类用作继承实体的基类。
    • @D.R.如果允许业务逻辑选项不正确,任何解决方案都容易出错。
    • 我们不想仅仅因为它需要验证就从基类派生我们的 DTO。我不认为这是好的设计。
    猜你喜欢
    • 2011-08-08
    • 1970-01-01
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 2017-12-16
    相关资源
    最近更新 更多