C# (.NET) 中使用 FluentValidation 进行数据验证:完整指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

C# (.NET) 中的数据验证:强大的 FluentValidation 工具



数据验证是使用 C# (.NET) 开发安全可靠应用程序的关键方面之一。无论您是在 ASP.NET Core 上创建 Web API、在 WPF 上创建桌面应用程序还是创建控制台工具,输入数据验证都有助于避免错误、SQL 注入和系统运行异常。在本文中,我们将详细介绍 FluentValidation 库——这是 .NET 生态系统中一种现代、灵活且广泛使用的验证工具。



什么是 FluentValidation,为什么需要它?



FluentValidation 是一个用于 .NET 的开源库,它允许使用流畅接口(方法调用链)来描述对象验证规则。与内置的 DataAnnotations 属性不同,FluentValidation:



  • 将验证逻辑与数据模型分离——规则被提取到单独的验证器类中。
  • 支持复杂场景——条件检查、自定义规则、跨属性验证。
  • 与 ASP.NET Core 集成——自动验证控制器中的模型。
  • 简化测试——验证器可以轻松隔离并进行单元测试覆盖。


安装与配置



首先,通过 NuGet 包管理器或 .NET CLI 安装包:



dotnet add package FluentValidation


如果您使用 ASP.NET Core,请在 Program.cs(或 Startup.cs)中添加验证器注册:



builder.Services.AddValidatorsFromAssemblyContaining<MyValidator>();


创建简单的验证器



假设我们有一个用户模型:



public class User{    public int Id { get; set; }    public string Name { get; set; }    public string Email { get; set; }    public int Age { get; set; }}


创建一个继承自 AbstractValidator<User> 的验证器:



using FluentValidation;

public class UserValidator : AbstractValidator<User>{ public UserValidator() { RuleFor(user => user.Name) .NotEmpty().WithMessage("姓名必填") .Length(2, 50).WithMessage("姓名长度应在 2 到 50 个字符之间");

RuleFor(user => user.Email) .NotEmpty().WithMessage("电子邮件必填") .EmailAddress().WithMessage("电子邮件格式不正确");

RuleFor(user => user.Age) .InclusiveBetween(18, 120).WithMessage("年龄应在 18 到 120 岁之间"); }}


现在可以执行验证:



var validator = new UserValidator();var user = new User { Name = "A", Email = "invalid", Age = 15 };var result = validator.Validate(user);

if (!result.IsValid){ foreach (var error in result.Errors) { Console.WriteLine($"属性 {error.PropertyName} 出错:{error.ErrorMessage}"); }}


高级功能



1. 自定义规则



可以使用 Must 方法编写自己的验证逻辑,或创建单独的方法:



RuleFor(user => user.Name)    .Must(name => !string.IsNullOrEmpty(name) && name.All(char.IsLetter))    .WithMessage("姓名只能包含字母");


2. 条件验证



仅在满足特定条件时验证属性:



RuleFor(user => user.Email)    .NotEmpty().When(user => user.Age > 18)    .WithMessage("成年用户必须填写电子邮件");


3. 跨属性验证



比较不同属性的值:



RuleFor(user => user.Password)    .Equal(user => user.ConfirmPa                    

推荐