栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > .Net

.net6使用最小api(5)— 自定义模型验证3-FluentValidation

.Net 更新时间:发布时间: 百科书网 趣学号

前言

模型验证的方式有很多种,之前几篇文章中也有其它两种,我们今天讲第三种验证的方式,结合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是以集中式的方式来验证规则,支持通过写法验证,支持全局验证,方便后期维护与扩展,推荐大家使用。

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/1065987.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号