.net6使用最小api(4)— 自定义模型验证2

前言

在使用参数模型验证时,根据使用人习惯的不同会选择不同的模型验证,有人有选择api自带的模型验证,有的人会重写api模型验证,有的人会用第三方控件FluentValidation.AspNetCore来验证模型,各有所爱,可以自行选择验证方式。

这里我们先介绍第二种自定义重写api的模型验证方法IsValid,下一篇在介绍第三种验证方式

以往文章回顾:

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

.net6使用最小api(2)——依赖注入Autofac之属性注入

.net6使用最小api(1)——依赖注入Autofac之构造函数注入

项目实战

1、先定义模型实体,如下:

/// <summary>
/// 添加会员参数,并添加验证属性
/// </summary>
[AddMemberParamValidationAttribute]
public class AddMemberParam
{
    /// <summary>
    /// 会员名称
    /// </summary>
    public string MemberName { get; set; }
    /// <summary>
    /// 密码
    /// </summary>
    public string Password { get; set; }
    /// <summary>
    /// 确认密码
    /// </summary>
    public string ConfirmPassword { get; set; }
    /// <summary>
    /// 会员类型
    /// </summary>
    public string MemberType { get; set; }
    /// <summary>
    /// 真实姓名
    /// </summary>
    public string TrueName { get; set; }
    /// <summary>
    /// 手机号
    /// </summary>
    public string Mobile { get; set; }
}

2、验证模型类方法

创建一个模型验证类为AddMemberParamValidationAttribute,并继承ValidationAttribute,代码如下:

/// <summary>
/// 自定义属性验证
/// </summary>
public class AddMemberParamValidationAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var userDto = (AddMemberParam)validationContext.ObjectInstance;   //获取类的实例对象            //验证用户名不能为空
            if (string.IsNullOrWhiteSpace(userDto.MemberName))
        {
            return new ValidationResult("用户名不能为空", new[] { nameof(userDto.MemberName) });
        }
        if (string.IsNullOrWhiteSpace(userDto.Password))
        {
            return new ValidationResult("密码不能为空", new[] { nameof(userDto.Password) });
        }
        if (string.IsNullOrWhiteSpace(userDto.Mobile))
        {
            return new ValidationResult("手机号不能为空", new[] { nameof(userDto.Mobile) });
        }
        if (!string.IsNullOrWhiteSpace(userDto.Mobile))
        {
            var regex = new Regex(@"^1[3456789]\d{9}$"); if (!regex.IsMatch(userDto.Mobile)) return new ValidationResult("手机号不符合规则", new[] { nameof(userDto.Mobile) });
        }
        if (!string.IsNullOrWhiteSpace(userDto.Password))
        {
            // 必须包含数字
            //必须包含小写或大写字母
            //必须包含特殊符号
            //至少6个字符,最多16个字符
            var regex = new Regex(@"
                                  (?=.*[0-9])                     
                                      (?=.*[a-zA-Z])                 
                                      (?=([\x21-\x7e]+)[^a-zA-Z0-9])  
                                      .{6,16}", RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace);
            if (!regex.IsMatch(userDto.Password))
            {
                return new ValidationResult("密码不符合规则,请重新输入", new[] { nameof(userDto.Password) });
            }
        }
        if (!string.IsNullOrWhiteSpace(userDto.ConfirmPassword))
        {
            if (!userDto.Password.Equals(userDto.ConfirmPassword))
            {
                return new ValidationResult("两次输入密码不同,请重新输入", new[] {
                    nameof(userDto.Password),
                    nameof(userDto.ConfirmPassword)
                });
            }
        }
        return ValidationResult.Success;
    }
}

3、控制器调用,与正常api写法一样,如下:

/// <summary>
  /// 添加用户,并会自动验证模型
  /// </summary>
  /// <param name="param"></param>
  /// <returns></returns>
  [HttpPost("Add")]
  public async Task<ResponseResult> Add(AddMemberParam param)
  {
      var a = await _memberService.Add(param);
      return a;
  }

执行结果如下:

fe546a95f5526687a127b897c46d2404.png

e80e83f14aef7aaad25324453db00024.png

4、最小api配置,并返回统一模型结果

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers()
.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);
    };
});

总结

重写验证模型可以很方便对入参进行合法验证,但在实战中可能需要创建很多的入参验证类,感觉不是很方便,有的人想到会用反射来处理,个人感觉也并不友好,也会影响性能问题。

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

此验证与本文验证逻辑差不多,只是重写了IsValid方法,下一篇文章介绍FluentValidation.AspNetCore验证模型,三种方法大家可选择喜欢的一种,如果有更好的验证方式,欢迎一起交流学习。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值