自定义数据注释CompareAttribute

时间:2016-08-09 12:31:32

标签: c# properties data-annotations

我需要使用.net data annotations比较一个类中的两个属性。应填充两个属性中的一个,另一个应为空白。如何覆盖CompareAttribute的行为?如果不可能,替代解决方案是什么?

这个课程有一个问题: 如果属性A设置为某个且属性B已具有值,则属性A将按预期变为无效。在消隐属性B时,属性A应该变为有效但是直到我尝试修改属性A才会失败,所以我再次触发验证。有没有办法将两者连接在一起以触发两者之一的更改?

 class CustomAttribute : ValidationAttribute
        {
        private readonly string _other;
        public CustomAttribute(string other)
            {
            _other = other;
            }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
        var property = validationContext.ObjectType.GetProperty(_other);
        if (property == null)
            {
            return new ValidationResult(
                string.Format("Unknown property: {0}", _other)
            );
            }
        var otherValue = property.GetValue(validationContext.ObjectInstance, null);


        if (!String.IsNullOrEmpty(value.ToString()) && !String.IsNullOrEmpty(otherValue.ToString()))
            {
              return new ValidationResult("Test");
            }
        return null;
        }
    }

2 个答案:

答案 0 :(得分:1)

对于这样的东西,我使用ExpressiveAnnotations。它有一个辉煌的RequiredIf属性:

[RequiredIf("B == null", ErrorMessage = "Either A or B should be filled")]
public string A { get; set; }

[RequiredIf("A == null", ErrorMessage = "Either A or B should be filled")]
public string B { get; set; }

答案 1 :(得分:0)

您可以使用自己的课程扩展CompareAttribute

public class CustomCompareAttribute: CompareAttribute {
    public CustomCompareAttribute(string otherProperty) : base(otherProperty) {
    }

   protected override ValidationResult IsValid(object value, ValidationContext validationContext) {
       if (OtherProperty == null && value == null) {
            return new ValidationResult("Either A or B should be filled");
        }
        // more checks here ...
   }
}