📜  何时需要 C# ValidationAttribute - C# (1)

📅  最后修改于: 2023-12-03 15:36:24.422000             🧑  作者: Mango

何时需要 C# ValidationAttribute

C# ValidationAttribute可以用于验证参数或属性是否符合要求,在开发中非常有用。主要有以下几种场景:

验证方法参数

当开发一个方法时,如果需要验证参数是否正确,就可以使用ValidationAttributes进行验证。例如,我们需要验证一个人的年龄是否大于18岁:

public void Vote([Range(18, int.MaxValue)] int age)
{
    // 只有年龄大于等于18岁时,才会执行投票动作
}

上面的代码中,我们使用了RangeAttribute来验证age参数是否在18岁及以上。如果age小于18岁,投票动作就不会执行。

在验证时,也可以使用其他的ValidationAttributes。例如,RegularExpressionAttribute可以用于验证字符串是否符合某个正则表达式的格式,如下所示:

public void VerifyEmail([RegularExpression(@"[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z0-9]+", ErrorMessage = "邮箱格式不正确")] string email)
{
    // 通过邮箱验证
}

上面的代码中,我们使用了RegularExpressionAttribute来验证email参数是否符合邮箱的格式。

验证实体对象

在开发中,一个实体对象中可能有很多属性需要进行验证。如果每个属性都使用ValidationAttributes进行验证,就显得很麻烦。这时,可以考虑使用继承ValidationAttribute的自定义类来实现验证。例如,我们需要验证一个人的姓名和年龄:

public class Person
{
    [Required(ErrorMessage = "姓名不能为空")]
    [StringLength(10, MinimumLength = 2, ErrorMessage = "姓名应该在2~10个字符之间")]
    public string Name { get; set; }
    
    [Range(18, int.MaxValue, ErrorMessage = "年龄必须大于18岁")]
    public int Age { get; set; }
}

上面的代码中,我们使用了RequiredAttribute和StringLengthAttribute来验证Name属性的值是否符合要求,使用RangeAttribute来验证Age属性的值是否在18岁及以上。

验证过程中处理错误

在验证属性或实体对象时,如果遇到错误,可以使用ValidationResult类来处理。例如,我们需要验证一个人的年龄:

public class Person
{
    [Range(18, int.MaxValue, ErrorMessage = "年龄必须大于18岁")]
    public int Age { get; set; }
}

public void VerifyAge(Person person)
{
    var results = new List<ValidationResult>();
    var context = new ValidationContext(person);
    bool isValid = Validator.TryValidateObject(person, context, results, true);
    if (!isValid)
    {
        foreach (var result in results)
        {
            Console.WriteLine(result.ErrorMessage);
        }
    }
}

上面的代码中,我们使用了Validator.TryValidateObject方法来验证person对象,在验证过程中,如果发现错误,就会添加到results中。最后,我们遍历results来输出错误信息。

总结

C# ValidationAttribute 可以用于验证参数或属性是否符合要求,非常适合在实际开发中使用。我们可以使用ValidationAttributes来验证参数、属性和实体对象,并通过ValidationResult类处理验证过程中的错误。