C# (.NET) 数据验证:完整指南
数据验证是使用 C# 开发可靠且安全应用程序的关键方面之一。它确保输入数据符合预期的格式、值范围和业务规则。在 .NET 生态系统中,有几种强大的验证工具:从内置的 System.ComponentModel.DataAnnotations 属性到灵活的 FluentValidation 库。在本文中,我们将通过代码示例详细分析这两种方法。
1. 通过 DataAnnotations 进行内置验证
System.ComponentModel.DataAnnotations 命名空间提供了一组可应用于模型类属性的属性。这是最简单的验证方法,尤其在 ASP.NET Core MVC 和 Blazor 中。
主要属性:
[Required]— 值不能为null或为空。[StringLength(max)]— 字符串长度限制。[Range(min, max)]— 数值范围检查。[RegularExpression(pattern)]— 正则表达式检查。[EmailAddress]— 电子邮件验证。[Compare("OtherProperty")]— 两个属性的比较(例如,密码和确认密码)。
带有属性的模型示例:
public class UserRegistrationDto{ [Required(ErrorMessage = "姓名为必填项")] [StringLength(50, MinimumLength = 2, ErrorMessage = "姓名长度应在 2 到 50 个字符之间")] public string FirstName { get; set; }
[Required(ErrorMessage = "电子邮件为必填项")] [EmailAddress(ErrorMessage = "电子邮件格式不正确")] public string Email { get; set; }
[Required] [Range(18, 120, ErrorMessage = "年龄应在 18 到 120 之间")] public int Age { get; set; }
[Required] [DataType(DataType.Password)] public string Password { get; set; }
[Compare("Password", ErrorMessage = "密码不匹配")] public string ConfirmPassword { get; set; }}手动模型验证:
public static bool ValidateUser(UserRegistrationDto user, out List<ValidationResult> errors){ var context = new ValidationContext(user); errors = new List<ValidationResult>(); return Validator.TryValidateObject(user, context, errors, validateAllProperties: true);}
// 使用:var user = new UserRegistrationDto { FirstName = "A", Email = "invalid", Age = 15 };if (!ValidateUser(user, out var errors)){ foreach (var error in errors) Console.WriteLine(error.ErrorMessage);}2. FluentValidation — 高级验证
FluentValidation 库(NuGet: FluentValidation.AspNetCore)通过流畅接口提供了一种更灵活、更易读的验证规则描述方式。它非常适合复杂场景:条件验证、自定义消息、规则链以及与 DI 容器的集成。
通过 NuGet 安装:
dotnet add package FluentValidation.AspNetCore验证器示例:
using FluentValidation;
public class UserValidator : AbstractValidator<UserRegistrationDto>{ public UserValidator() { RuleFor(u => u.FirstName) .NotEmpty().WithMessage("姓名不能为空") .Length(2, 50).WithMessage("姓名长度应在 2 到 50 个字符之间");
RuleFor(u => u.Email) .NotEmpty().WithMessage("电子邮件为必填项") .EmailAddress().WithMessage("电子邮件格式不正确");
RuleFor(u => u.Age) .InclusiveBetween(18, 120).WithMessage("年龄应在