
前言
模型验证的方式有很多种,之前几篇文章中也有其它两种,我们今天讲第三种验证的方式,结合FluentValidation组件来实现。
场景:
在我们用户登录时,需要输入用户名和密码等信息时,就要进行验证规则,此时需要验证
1、用户名不能为空,用户名至少2个字符,最多12个字符
2、密码不能为空,密码长度至少6个字符,最多16个字符
3、密码不符合规则,必须包含数字、小写或大写字母、特殊符号
4、确认密码不能为空,确认密码必须跟密码一样
5、手机号不能为空,手机号格式不正确
等这样的验证规则。。。。
项目实战
1、添加引用包:FluentValidation.AspNetCore
2、定义参数模型
public class AddMemberParam
{
///
/// 会员名称
///
public string MemberName { get; set; }
///
/// 密码
///
public string Password { get; set; }
///
/// 确认密码
///
public string ConfirmPassword { get; set; }
///
/// 会员类型
///
public string MemberType { get; set; }
///
/// 真实姓名
///
public string TrueName { get; set; }
///
/// 手机号
///
public string Mobile { get; set; }
}
3、添加FluentValidation模型验证
添加类文件名为AddMemberParamValidator,如下代码:
////// FluentValidation模型验证 /// public class AddMemberParamValidator : AbstractValidator { public AddMemberParamValidator() { CascadeMode = CascadeMode.Stop; RuleFor(x => x.MemberName).NotEmpty().WithMessage("用户名不能为空").Length(2, 12).WithMessage("用户名至少2个字符,最多12个字符"); RuleFor(x => x.Password).NotEmpty().WithMessage("密码不能为空").Length(6, 16).WithMessage("密码长度至少6个字符,最多16个字符").Must(EncryptionPassword).WithMessage("密码不符合规则,必须包含数字、小写或大写字母、特殊符号"); RuleFor(x => x.ConfirmPassword).NotEmpty().WithMessage("确认密码不能为空").Must(ComparePassword).WithMessage("确认密码必须跟密码一样"); RuleFor(x => x.Mobile).NotEmpty().WithMessage("手机号不能为空").Must(IsMobile).WithMessage("手机号格式不正确"); } private bool EncryptionPassword(string password) { //正则 var regex = new Regex(@" (?=.*[0-9]) (?=.*[a-zA-Z]) (?=([x21-x7e]+)[^a-zA-Z0-9]) .{6,16}", RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace); return regex.IsMatch(password); } /// 比较两次密码是否一样 /// 这里传的是:ConfirmPassword private bool ComparePassword(AddMemberParam model, string confirmpwd) { return string.Equals(model.Password, confirmpwd, StringComparison.OrdinalIgnoreCase); } private bool IsMobile(string arg) { return Regex.IsMatch(arg, @"^[1][3-8]d{9}$"); } }
4、最小api配置AddFluentValidation方法:
包括单个文件添加验证,多个文件批量添加验证
builder.Services.AddControllers(option =>
{
//全局处理异常,支持DMS.Log4net,DMS.NLogs
option.Filters.Add();
}).AddJsonOptions(options =>
{
options.JsonSerializerOptions.Converters.Add(new DateTimeJsonConverter("yyyy-MM-dd HH:mm:ss"));
//options.JsonSerializerOptions.PropertyNamingPolicy = null;
//options.JsonSerializerOptions.DictionaryKeyPolicy = null;
})
.AddFluentValidation(config =>
{
//程序集方式添加验证
//config.RegisterValidatorsFromAssemblyContaining(typeof(AddMemberParamValidator));
//批量添加验证
var validatorList = DMS.Common.Extensions.TypeExtensions.GetTypeList("DMS.IServices", "Validator");
foreach (var item in validatorList)
{
config.RegisterValidatorsFromAssemblyContaining(item);
}
})
.ConfigureApiBehaviorOptions(options =>
{
//使用自定义模型验证
options.InvalidModelStateResponseFactory = (context) =>
{
var result = new ResponseResult()
{
errno = 1,
errmsg = string.Join(Environment.NewLine, context.ModelState.Values.SelectMany(v => v.Errors.Select(e => e.ErrorMessage)))
};
return new JsonResult(result);
};
});
4、控制器调用
包括FluentValidation通知验证
包括全局验证
[HttpPost("Add")]
public async Task Add(AddMemberParam param)
{
//通用FluentValidation验证方法
//AddMemberParamValidator validationRules = new AddMemberParamValidator();
//var validResult = validationRules.Validate(param);
//if (!validResult.IsValid)
//{
// validResult.AddToModelState(ModelState, string.Empty);
//}
var a = await _memberService.Add(param);
return a;
}
5、测试效果如下
5、总结
FluentValidation是以集中式的方式来验证规则,支持通过写法验证,支持全局验证,方便后期维护与扩展,推荐大家使用。