在C#项目开发中,数据校验是几乎所有业务场景都需要处理的基础工作,传统的手动校验逻辑往往分散在业务代码中,可读性和可维护性较差。FluentValidation是一个基于.NET平台的验证框架,它支持通过链式调用的方式定义校验规则,让验证逻辑更集中、更清晰,同时提供了丰富的内置校验方法,能够满足大部分常见的数据校验需求。

FluentValidation框架引入
首先需要在项目中安装FluentValidation的NuGet包,如果你使用的是.NET Core或者.NET 5及以上版本的项目,可以通过NuGet包管理器搜索FluentValidation进行安装,也可以通过命令行执行以下命令完成安装:
// 使用NuGet命令行安装FluentValidation Install-Package FluentValidation
如果是ASP.NET Core项目,还可以安装FluentValidation.AspNetCore包,方便和框架的依赖注入、模型绑定功能集成,本文主要讲解基础使用方式,先以控制台项目为例演示。
定义待验证的实体类
首先需要定义需要校验的实体类,比如我们定义一个用户注册的实体类RegisterUser,包含用户名、密码、邮箱和年龄四个属性:
public class RegisterUser
{
public string UserName { get; set; }
public string Password { get; set; }
public string Email { get; set; }
public int Age { get; set; }
}
编写链式风格的验证器
FluentValidation的核心是通过继承AbstractValidator<T>类来定义验证器,其中T是待验证的实体类型,在验证器中可以通过链式调用的方式定义各个属性的校验规则。
基础验证器定义
我们为RegisterUser创建一个对应的验证器RegisterUserValidator:
using FluentValidation;
public class RegisterUserValidator : AbstractValidator<RegisterUser>
{
public RegisterUserValidator()
{
// 用户名校验规则:非空,长度2-20位
RuleFor(x => x.UserName)
.NotEmpty().WithMessage("用户名不能为空")
.Length(2, 20).WithMessage("用户名长度需要在2到20位之间");
// 密码校验规则:非空,长度至少8位,包含数字和字母
RuleFor(x => x.Password)
.NotEmpty().WithMessage("密码不能为空")
.MinimumLength(8).WithMessage("密码长度不能少于8位")
.Matches(@"^(?=.*[A-Za-z])(?=.*d).+$").WithMessage("密码需要同时包含字母和数字");
// 邮箱校验规则:非空,符合邮箱格式
RuleFor(x => x.Email)
.NotEmpty().WithMessage("邮箱不能为空")
.EmailAddress().WithMessage("邮箱格式不正确");
// 年龄校验规则:大于0,小于等于120
RuleFor(x => x.Age)
.GreaterThan(0).WithMessage("年龄需要大于0")
.LessThanOrEqualTo(120).WithMessage("年龄不能超过120岁");
}
}
上面的代码中,RuleFor方法用于指定要校验的属性,后续的NotEmpty、Length等方法就是链式调用的校验规则,每个规则后面可以跟上WithMessage方法指定校验失败时的提示信息,这就是典型的链式风格校验规则写法。
复杂链式规则示例
FluentValidation还支持条件校验、自定义校验等更复杂的链式规则,比如我们需要校验当用户年龄小于18岁时,邮箱必须是家长邮箱:
public class RegisterUserValidator : AbstractValidator<RegisterUser>
{
public RegisterUserValidator()
{
// 之前的规则省略...
// 条件校验规则:如果年龄小于18,邮箱需要包含parent标识
RuleFor(x => x.Email)
.Must((user, email) =>
{
if (user.Age < 18)
{
return email.Contains("parent");
}
return true;
}).WithMessage("未成年人注册需要提供家长邮箱,邮箱需要包含parent标识")
.When(x => x.Age < 18); // 只有当年龄小于18时才执行该规则
}
}
执行校验操作
定义好验证器之后,就可以创建验证器实例,调用Validate方法对待验证对象执行校验,校验结果会包含是否通过、失败的校验信息等:
class Program
{
static void Main(string[] args)
{
// 创建待验证的用户对象
var user = new RegisterUser
{
UserName = "张",
Password = "123",
Email = "test@ippipp.com",
Age = 15
};
// 创建验证器实例
var validator = new RegisterUserValidator();
// 执行校验
var validationResult = validator.Validate(user);
// 判断校验是否通过
if (!validationResult.IsValid)
{
Console.WriteLine("数据校验失败,错误信息如下:");
// 遍历所有校验失败的记录
foreach (var error in validationResult.Errors)
{
Console.WriteLine($"属性:{error.PropertyName},错误:{error.ErrorMessage}");
}
}
else
{
Console.WriteLine("数据校验通过");
}
}
}
上面的示例中,我们构造的user对象存在多处不符合校验规则的地方,执行后会输出所有校验失败的信息,开发者可以根据这些信息给用户对应的提示。
常用内置校验方法汇总
FluentValidation提供了很多常用的内置校验方法,以下是一些高频使用的方法说明:
| 方法名 | 作用说明 |
|---|---|
| NotEmpty() | 校验属性值不能为空,对于字符串会校验非空且非空白字符 |
| NotNull() | 校验属性值不能为null,和NotEmpty的区别是不会校验空白字符串 |
| Length(min, max) | 校验字符串长度在指定范围内 |
| MinimumLength(length) | 校验字符串长度不小于指定值 |
| EmailAddress() | 校验字符串符合邮箱格式 |
| GreaterThan(value) | 校验数值大于指定值 |
| LessThanOrEqualTo(value) | 校验数值小于等于指定值 |
| Matches(regex) | 校验字符串符合指定的正则表达式 |
| Must(predicate) | 自定义校验逻辑,传入一个返回bool的委托 |
| When(condition) | 指定规则生效的条件 |
注意事项
- 验证器类是线程安全的,建议在项目中通过依赖注入的方式单例使用,不需要每次校验都创建新实例。
- 链式规则的顺序不影响校验结果,所有规则都会执行,除非使用了
When等条件限制。 - 如果需要校验集合类型的属性,可以使用
RuleForEach方法,对集合中的每个元素应用校验规则。 - 自定义错误信息时,可以使用占位符,比如
{PropertyName}会自动替换为当前校验的属性名,{MinLength}会替换为对应规则的最小长度值等。
C#FluentValidation数据校验链式风格验证规则修改时间:2026-07-16 14:33:41