FluentValidation 可以 提供 数据效验的 解耦性,通俗讲 就是 一个类 可以 有多种效验方法,相互都是独立文件,传输和效验 完全分开。并且 自定义 效验 比较 容易。
下面讲解 使用方式
1. 首先 建立 ModifyUser2.cs文件 用于模型类
using System.ComponentModel.DataAnnotations;
namespace aspnetcore014
{
public class ModifyUser2
{
public string Name { get; set; }
public string Email { get; set; }
public string Password1 { get; set; }
public string Password2 { get; set; }
}
}
2.建立 ModifyUserIntendedEffect.cs文件 用于 效验。 这个自定义的类 必须继承 AbstractValidator<实体类> 并在 在 构造函数中 设置效验方法
using FluentValidation;
using FluentValidation.Validators;
namespace aspnetcore014
{
public class ModifyUserIntendedEffect:AbstractValidator<ModifyUser2>
{
public ModifyUserIntendedEffect()
{ //Must为自定义 效验
RuleFor(x=>x.Name).NotNull().Length(3,10)
.WithMessage("用户名必须3到10位");
RuleFor(x => x.Email).NotNull().EmailAddress()
.Must(x => x.EndsWith("@163.com") || x.EndsWith("@qq.com"))
.WithMessage("必须是163或qq邮箱");
RuleFor(x => x.Password1).NotNull().Length(5, 10)
.WithMessage("密码长度为5到10")
.Equal(x => x.Password2).WithMessage("两次密码必须相等");
}
}
}
3.测试程序
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace aspnetcore014.Controllers
{
[Route("api/[controller]/[action]")]
[ApiController]
public class Test1Controller : ControllerBase
{
[HttpPut]
public string ModifyUser2(ModifyUser2 modifyUser)
{
return "ok";
}
}
}
故意写错 返回结果为:
{
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"traceId": "00-9276e344142d80a35dcfbed128b34b09-3bd8a3713637dd3f-00",
"errors": {
"Name": [
"用户名必须3到10位"
],
"Email": [
"'Email' 不是有效的电子邮件地址。",
"必须是163或qq邮箱"
],
"Password1": [
"密码长度为5到10",
"两次密码必须相等"
]
}
}
引用nuget 包为:
FluentValidation.AspNetCore
在Program.cs 文件中配置 如下:
//启动自动验证
builder.Services.AddFluentValidationAutoValidation();
//注入 ModifyUser2 ModifyUserIntendedEffect 对应上面两个cs文件
builder.Services.AddScoped<IValidator<ModifyUser2>, ModifyUserIntendedEffect>();