数据校验
大约 1 分钟
数据校验
数据校验的好处
- 过滤非法、不安全的数据,提高系统的稳定性、可靠性
- 减少不必要的业务异常处理
校验方式
- 传统方式、在业务代码之前手动校验
- 模型验证,.NetCore 内置的
DataAnnotations
方式 - 其他方式,使用第三方验证库,如
FluentValidatio
传统方式
public bool UserRegister(UserDto person)
{
// 验证参数
if(string.IsNullOrEmty(person.Name))
{
throw new System.Exception("用户名不能为空");
}
// 业务代码
_userService.Register(person.Adapt<User>());
// ...
}
Model 特性方式
在 ASP.NET Core
中,微软为我们提供了全新的 特性
验证方式,可通过对对象贴特性实现数据验证。这种方式有效的将数据校验和业务代码剥离开来,而且容易使用和拓展。
- 在模型中验证
using System.ComponentModel.DataAnnotations;
namespace ZR.Model.System.Dto
{
public class RegisterDto
{
/// <summary>
/// 用户名
/// </summary>
[MinLength(4)] // 最小长度验证
[Required(ErrorMessage = "用户名不能为空")]
public string Username { get; set; }
/// <summary>
/// 用户密码
/// </summary>
[Required(ErrorMessage = "密码不能为空")]
[MinLength(6)] // 最小长度验证
public string Password { get; set; }
}
}
内置特性
想了解更多内置特性,请查看官方文档 ASP.NET Core-模型验证
使用FluentValidation
第三方校验
安装:dotnet add package FluentValidation.AspNetCore
在
program.cs
中注册
services.AddControllers()
.AddFluentValidation(fv => {
fv.RegisterValidatorsFromAssemblies(App.Assemblies);
});
- 使用
public class CustomerValidator : AbstractValidator<Customer>
{
public CustomerValidator()
{
RuleFor(x => x.Surname).NotEmpty();
RuleFor(x => x.Forename).NotEmpty().WithMessage("Please specify a first name");
RuleFor(x => x.Discount).NotEqual(0).When(x => x.HasDiscount);
RuleFor(x => x.Address).Length(20, 250);
RuleFor(x => x.Postcode).Must(BeAValidPostcode).WithMessage("Please specify a valid postcode");
}
private bool BeAValidPostcode(string postcode)
{
// custom postcode validating logic goes here
}
}
如需了解更多 FluentValidation
知识可查阅官方文档:https://fluentvalidation.net/