Data Annotation仅在字段上使用get accessor时验证

时间:2016-04-29 07:55:50

标签: c# validation attributes data-annotations

在验证数据注释时,为什么在您要验证的属性上使用get访问器时,它似乎只是验证(正确)?

鉴于下面的示例,Name属性将始终被视为有效,即使它未被分配,但Address属性只有在分配了非空字符串值时才被视为有效,因为它使用get访问器。这是为什么?

肯定TryValidateObject基本上只会使用test.Address来访问该值,无论是否通过get访问器。

class Program
{
    static void Main(string[] args)
    {
        var test = new Test();
        var _errors = new List<ValidationResult>();

        bool isValid = Validator.TryValidateObject(
            test, new ValidationContext(test), _errors, true);
    }
}

public class Test
{
    [Required]
    public string Name; // Returns true even when unassigned / null / empty string

    [Required]
    public string Address { get; } // Only returns true when assigned a non-empty string
}

1 个答案:

答案 0 :(得分:2)

原因是Validator.TryValidateObject只会检查属性和类级别注释,但您的Name是一个字段,而不是一个属性(请参阅here Validator类的文档没有提到字段)。如果您将任何其他属性(例如Range)应用于某个字段 - 它也无法使用Validator.TryValidateObjectRequiredAttribute可以应用于字段的原因是因为RequiredAttribute是其自身的实体,并且与任何方式的Validator类无关。任何其他验证机制都可以验证公共字段,它只是特定的Validator类,而不是。