.NetCore_校验规则(FluentValidation)

一、简介

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.");
                }
            });
    }
}

三、常用校验规则

  1. NotEmpty

    • 验证字段不为空(字符串不能为空,集合不为空,数值不为零等)。

    • RuleFor(x => x.Username).NotEmpty().WithMessage("Username is required.");
      
  2. NotNull

    • 验证字段不为 null。适用于所有类型的属性。

    • RuleFor(x => x.Email).NotNull().WithMessage("Email cannot be null.");
      
  3. Length

    • 验证字符串长度是否在指定范围内。

    • RuleFor(x => x.Username).Length(5, 15).WithMessage("Username must be between 5 and 15 characters.");
      
  4. MinimumLength

    • 验证字符串是否至少有指定的长度。

    • RuleFor(x => x.Password).MinimumLength(8).WithMessage("Password must be at least 8 characters long.");
      
  5. MaximumLength

    • 验证字符串是否不超过指定的长度。

    • RuleFor(x => x.Description).MaximumLength(200).WithMessage("Description cannot exceed 200 characters.");
      
  6. EmailAddress

    • 验证字符串是否符合电子邮件地址的格式。

    • RuleFor(x => x.Email).EmailAddress().WithMessage("Invalid email format.");
      
  7. Matches

    • 验证字符串是否符合指定的正则表达式。

    • RuleFor(x => x.Password).Matches("^[a-zA-Z0-9]*$").WithMessage("Password must contain only alphanumeric characters.");
      
  8. InclusiveBetween

    • 验证数值是否在指定的范围内,包括边界值。

    • RuleFor(x => x.Age).InclusiveBetween(18, 65).WithMessage("Age must be between 18 and 65.");
      
  9. ExclusiveBetween

    • 验证数值是否在指定的范围内,但不包括边界值。

    • RuleFor(x => x.Price).ExclusiveBetween(0, 1000).WithMessage("Price must be between 0 and 1000, exclusive.");
      
  10. GreaterThan

    • 验证数值是否大于指定值。

    • RuleFor(x => x.Amount).GreaterThan(0).WithMessage("Amount must be greater than zero.");
      
  11. csharpGreaterThanOrEqualTo

    • 验证数值是否大于或等于指定值。

    • RuleFor(x => x.Rating).GreaterThanOrEqualTo(1).WithMessage("Rating must be at least 1.");
      
  12. LessThan

    • 验证数值是否小于指定值。

    • RuleFor(x => x.Quantity).LessThan(100).WithMessage("Quantity must be less than 100.");
      
  13. LessThanOrEqualTo

    • 验证数值是否小于或等于指定值。

    • RuleFor(x => x.Discount).LessThanOrEqualTo(50).WithMessage("Discount must be 50 or less.");
      
  14. Equal

    • 验证字段是否等于指定值。

    • RuleFor(x => x.Status).Equal("Active").WithMessage("Status must be 'Active'.");
      
  15. When

    • 基于某个条件来选择是否应用某些验证规则。

    • RuleFor(x => x.Password)
          .NotEmpty().WithMessage("Password is required.")
          .When(x => x.IsPasswordRequired);
      
  16. Unless

    • 基于某个条件来选择是否跳过某些验证规则。

    • RuleFor(x => x.Email)
          .EmailAddress().WithMessage("Invalid email format.")
          .Unless(x => !x.RequireEmail);
      
  17. Must

    • 使用自定义函数来验证字段值。

    • RuleFor(x => x.Age)
          .Must(age => age >= 18).WithMessage("You must be at least 18 years old.");
      
  18. DependentRules

    • 定义一个验证器,在特定的规则成功后,应用其他规则。

    • RuleFor(x => x.ConfirmPassword)
          .Equal(x => x.Password).WithMessage("Passwords must match.")
          .DependentRules(() =>
          {
              RuleFor(x => x.ConfirmPassword)
                  .NotEmpty().WithMessage("Confirm Password is required.");
          });
      
  19. SetValidator

    • 应用另一个验证器到集合类型属性。

    • RuleForEach(x => x.Items).SetValidator(new ItemValidator());
      
  20. Custom

    • 使用自定义验证逻辑。

    • RuleFor(x => x.Username)
          .Custom((username, context) =>
          {
              if (username.Contains(" "))
              {
                  context.AddFailure("Username cannot contain spaces.");
              }
          });
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值