有条件地打开/关闭DataAnnotation属性验证

时间:2016-09-12 00:16:20

标签: c# validation data-annotations

我是使用DataAnnotations进行验证的新手。我在控制台应用程序中使用它,所以不是ASP / MVC等。

public class Phone
{
   [Required]
   public string Mobile { get; set; }

   [Required]
   public string Office { get; set; }
}

public class Physician
{
    [Required]
    public Phone ContactPhone { get; set; }
}

public class Patient
{
    [Required]
    public Phone ContactPhone { get; set; }
}

现在,考虑一个Physician对象,需要Mobile和Office,但是对于Patient对象,只需要Mobile。如何根据给定条件打开/关闭验证属性行为?

1 个答案:

答案 0 :(得分:0)

听起来PhysicianPatient类需要决定Phone类内部和不需要的内容。我们可以通过首先避免注释来代替使用IValidatableObject接口。 Validator类还将检查此接口是否有任何其他验证。

public class Phone
{
    // no more required attributes here
    public string Mobile { get; set; }

    public string Office { get; set; }
}

public class Physician : IValidatableObject
{
    [Required]
    public Phone ContactPhone { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if(string.IsNullOrWhiteSpace(ContactPhone.Mobile))
        {
            yield return new ValidationResult("Mobile number is required");
        }

        if (string.IsNullOrWhiteSpace(ContactPhone.Office))
        {
            yield return new ValidationResult("Office number is required");
        }
    }
}

public class Patient : IValidatableObject
{
    [Required]
    public Phone ContactPhone { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (string.IsNullOrWhiteSpace(ContactPhone.Mobile))
        {
            yield return new ValidationResult("Mobile number is required");
        }
    }
}