下面给你准备一份 “在 .NET 标准库中进行数据验证的方法(完全指南)”,结构清晰、可直接用于技术文章、面试回答或 YouTube 技术口播。
✅ 在 .NET 标准库中进行数据验证的方法
(.NET Standard / .NET Core / .NET 5–8 全通用)
在使用 .NET 构建应用(API、桌面、服务、库)时,数据验证是最核心的一步。.NET 标准库提供多种验证方式,适用于 模型验证 / 手动验证 / Fluent 风格 / Attribute 特性验证 等场景。
◆ 方法 1:使用 DataAnnotations(最常用)
这是 .NET 内置的验证机制,无需任何第三方库。
1. 添加验证特性
public class UserDto
{
[Required]
public string Name { get; set; }
[Range(1, 120)]
public int Age { get; set; }
[EmailAddress]
public string Email { get; set; }
}
常用特性:
RequiredStringLengthRangeEmailAddressPhoneRegularExpressionCompareMaxLength/MinLength
2. 手动触发验证(.NET 标准库方式)
var dto = new UserDto { Name = null, Age = 150 };
var results = new List<ValidationResult>();
bool ok = Validator.TryValidateObject(dto, new ValidationContext(dto), results, true);
if (!ok)
{
foreach (var error in results)
Console.WriteLine(error.ErrorMessage);
}
✔ 不依赖 ASP.NET Core,纯标准库
✔ 可以在任何地方验证(Web API / WinForm / WPF / 控制台 / 服务)
◆ 方法 2:自定义属性验证
如果 DataAnnotations 不够用,可以自定义。
public class AdultAttribute : ValidationAttribute
{
public override bool IsValid(object value)
{
if (value is int age)
return age >= 18;
return false;
}
}
使用:
public class UserDto
{
[Adult(ErrorMessage = "Age must be >= 18.")]
public int Age { get; set; }
}
◆ 方法 3:实现 IValidatableObject(复杂对象验证)
适合跨字段验证:
public class RegisterDto : IValidatableObject
{
public string Password { get; set; }
public string Confirm { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (Password != Confirm)
{
yield return new ValidationResult("Passwords do not match", new[] { "Confirm" });
}
}
}
✔ 能做对象级别验证
✔ 不局限于单个字段
◆ 方法 4:使用 System.ComponentModel(更自由的验证)
你也可以手动构建验证逻辑:
public static void ValidateAge(int age)
{
if (age < 0 || age > 120)
throw new ArgumentOutOfRangeException(nameof(age), "Age must be 0-120");
}
适用:
✔ 核心业务逻辑
✔ 不希望依赖 Attribute 的库
✔ 自定义验证体系
◆ 方法 5:FluentValidation(推荐:现代、强大、优雅)
虽然不是“标准库”,但企业级项目最常用。
安装:
dotnet add package FluentValidation
验证器:
public class UserValidator : AbstractValidator<UserDto>
{
public UserValidator()
{
RuleFor(x => x.Name).NotEmpty();
RuleFor(x => x.Age).InclusiveBetween(1, 120);
}
}
使用:
var validator = new UserValidator();
var result = validator.Validate(dto);
if (!result.IsValid)
{
foreach (var err in result.Errors)
Console.WriteLine(err.ErrorMessage);
}
优势:
✔ 链式规则
✔ 大量强大扩展
✔ 单元测试友好
✔ ASP.NET Core 自动集成
◆ 方法 6:TryParse 模式(基本类型快速验证)
用于数字、日期、GUID 等验证:
if (!int.TryParse(input, out var value))
{
Console.WriteLine("Invalid number");
}
适用:
✔ 控制台输入
✔ 文本解析
✔ 不需要模型的场景
◆ 方法 7:Regular Expression(正则验证)
适用于自定义字符串格式。
var pattern = @"^[0-9]{6}$";
bool ok = Regex.IsMatch("123456", pattern);
或结合 DataAnnotation:
[RegularExpression(@"^\d{6}$")]
public string Code { get; set; }
◆ 方法 8:在 ASP.NET Core 中自动启用模型验证
只要你在 model 上加 DataAnnotations:
[ApiController]
public class UsersController : ControllerBase
{
[HttpPost]
public IActionResult Create(UserDto dto)
{
return Ok();
}
}
ASP.NET Core 会自动验证,并返回 400。
📌 最终建议(怎么选?)
| 场景 | 推荐方式 |
|---|---|
| 简单字段规则 | DataAnnotations |
| 对象级、多字段验证 | IValidatableObject |
| 企业级复杂验证 | FluentValidation |
| 业务逻辑校验(无模型) | 自定义 Validator |
| 字符串格式强校验 | Regex |
| 输入解析(如控制台) | TryParse |
发表回复