文章目录
一、简介
FluentValidation 是一个流行的 .NET 库,用于简化和增强对象验证的过程
二、使用指南
1. 安装 FluentValidation NuGet 包
使用 NuGet 包管理器控制台安装 FluentValidation:
Install-Package FluentValidation
或者在 .csproj
文件中添加:
<PackageReference Include="FluentValidation" Version="11.0.0" />
2. 创建一个模型
定义一个你要验证的模型类。例如,假设我们有一个用户注册模型:
public class User
{
public string Username { get; set; }
public string Email { get; set; }
public int Age { get; set; }
}
3. 创建一个验证器
创建一个继承自 AbstractValidator<T>
的验证器类来定义验证规则。例如,创建一个 UserValidator
类:
using FluentValidation;
public class UserValidator : AbstractValidator<User>
{
public UserValidator()
{
//用户名:不能为空 + 长度在5-15之间
RuleFor(user => user.Username)
.NotEmpty().WithMessage("Username is required.")
.Length(5, 15).WithMessage("Username must be between 5 and 15 characters.");
//Email:不能为空 + 必须是Email地址
RuleFor(user => user.Email)
.NotEmpty().WithMessage("Email is required.")
.EmailAddress().WithMessage("Invalid email format.");
//年龄:18-100之间
RuleFor(user => user.Age)
.InclusiveBetween(18, 100).WithMessage("Age must be between 18 and 100.");
}
}
4. 配置 FluentValidation 在 .NET Core 应用中
对于 ASP.NET Core
在 Startup.cs
中配置 FluentValidation:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers()
.AddFluentValidation(fv => fv.RegisterValidatorsFromAssemblyContaining<UserValidator>());
}
对于 .NET 6 或 .NET 7
在 Program.cs
中配置 FluentValidation:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers()
.AddFluentValidation(fv => fv.RegisterValidatorsFromAssemblyContaining<UserValidator>());
var app = builder.Build();
5. 使用验证器
当你在控制器中使用模型时,FluentValidation 会自动应用验证规则。例如:
[ApiController]
[Route("api/[controller]")]
public class UsersController : ControllerBase
{
[HttpPost]
public IActionResult CreateUser([FromBody] User user)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
// 处理有效的用户
return Ok();
}
}
FluentValidation 会自动集成到 ASP.NET Core 模型绑定和验证过程中,确保你的模型在请求到达控制器之前就已经被验证。
6. 自定义验证规则
除了内置的规则外,你可以创建自定义规则:
public class UserValidator : AbstractValidator<User>
{
public UserValidator()
{
RuleFor(user => user.Username)
.NotEmpty().WithMessage("Username is required.")
.Custom((username, context) =>
{
if (username.Contains(" "))
{
context.AddFailure("Username cannot contain spaces.");
}
});
}
}
三、常用校验规则
-
NotEmpty
-
验证字段不为空(字符串不能为空,集合不为空,数值不为零等)。
-
RuleFor(x => x.Username).NotEmpty().WithMessage("Username is required.");
-
-
NotNull
-
验证字段不为
null
。适用于所有类型的属性。 -
RuleFor(x => x.Email).NotNull().WithMessage("Email cannot be null.");
-
-
Length
-
验证字符串长度是否在指定范围内。
-
RuleFor(x => x.Username).Length(5, 15).WithMessage("Username must be between 5 and 15 characters.");
-
-
MinimumLength
-
验证字符串是否至少有指定的长度。
-
RuleFor(x => x.Password).MinimumLength(8).WithMessage("Password must be at least 8 characters long.");
-
-
MaximumLength
-
验证字符串是否不超过指定的长度。
-
RuleFor(x => x.Description).MaximumLength(200).WithMessage("Description cannot exceed 200 characters.");
-
-
EmailAddress
-
验证字符串是否符合电子邮件地址的格式。
-
RuleFor(x => x.Email).EmailAddress().WithMessage("Invalid email format.");
-
-
Matches
-
验证字符串是否符合指定的正则表达式。
-
RuleFor(x => x.Password).Matches("^[a-zA-Z0-9]*$").WithMessage("Password must contain only alphanumeric characters.");
-
-
InclusiveBetween
-
验证数值是否在指定的范围内,包括边界值。
-
RuleFor(x => x.Age).InclusiveBetween(18, 65).WithMessage("Age must be between 18 and 65.");
-
-
ExclusiveBetween
-
验证数值是否在指定的范围内,但不包括边界值。
-
RuleFor(x => x.Price).ExclusiveBetween(0, 1000).WithMessage("Price must be between 0 and 1000, exclusive.");
-
-
GreaterThan
-
验证数值是否大于指定值。
-
RuleFor(x => x.Amount).GreaterThan(0).WithMessage("Amount must be greater than zero.");
-
-
csharpGreaterThanOrEqualTo
-
验证数值是否大于或等于指定值。
-
RuleFor(x => x.Rating).GreaterThanOrEqualTo(1).WithMessage("Rating must be at least 1.");
-
-
LessThan
-
验证数值是否小于指定值。
-
RuleFor(x => x.Quantity).LessThan(100).WithMessage("Quantity must be less than 100.");
-
-
LessThanOrEqualTo
-
验证数值是否小于或等于指定值。
-
RuleFor(x => x.Discount).LessThanOrEqualTo(50).WithMessage("Discount must be 50 or less.");
-
-
Equal
-
验证字段是否等于指定值。
-
RuleFor(x => x.Status).Equal("Active").WithMessage("Status must be 'Active'.");
-
-
When
-
基于某个条件来选择是否应用某些验证规则。
-
RuleFor(x => x.Password) .NotEmpty().WithMessage("Password is required.") .When(x => x.IsPasswordRequired);
-
-
Unless
-
基于某个条件来选择是否跳过某些验证规则。
-
RuleFor(x => x.Email) .EmailAddress().WithMessage("Invalid email format.") .Unless(x => !x.RequireEmail);
-
-
Must
-
使用自定义函数来验证字段值。
-
RuleFor(x => x.Age) .Must(age => age >= 18).WithMessage("You must be at least 18 years old.");
-
-
DependentRules
-
定义一个验证器,在特定的规则成功后,应用其他规则。
-
RuleFor(x => x.ConfirmPassword) .Equal(x => x.Password).WithMessage("Passwords must match.") .DependentRules(() => { RuleFor(x => x.ConfirmPassword) .NotEmpty().WithMessage("Confirm Password is required."); });
-
-
SetValidator
-
应用另一个验证器到集合类型属性。
-
RuleForEach(x => x.Items).SetValidator(new ItemValidator());
-
-
Custom
-
使用自定义验证逻辑。
-
RuleFor(x => x.Username) .Custom((username, context) => { if (username.Contains(" ")) { context.AddFailure("Username cannot contain spaces."); } });
-