下面给你准备一份 “在 .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; }
}

常用特性:

  • Required
  • StringLength
  • Range
  • EmailAddress
  • Phone
  • RegularExpression
  • Compare
  • MaxLength / 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