.Net Core WebApi 项目中进行模型验证

1`  方法一:使用模型注解方式

缺点:只能用在属性上,会造成代码入侵,增加代码耦合,且只能在Controller中的Action中使用

优点:简单方便

①`创建实体类加上模型注解

//模型类
public class User
    {
        [MaxLength(10,ErrorMessage ="名字太长了")]
        public string userName { get; set; }
        [RegularExpression(@"^1[3456789]\d{9}$",ErrorMessage ="请输入正确的手机号")]
        public string userMobile { get; set; }
    }


//接口
public class ValidationTestController : ControllerBase
    {
        [HttpPost("Add")]
        public string AddUser(User user)
        {
            return "添加成功";
        }
    }

②`在请求Api时会自动校验

 

2`  方法二:自定义属性Attribute验证

缺点:只能在Controller中的Action中使用

优点:可以声明到类级别上,并且可以在方式一上继续封装,能实现复杂的验证

①`定义一个类:UserFilterValidationAttribute,继承ValidationAttribute类,重写IsVaild()

public class UserFilterValidationAttribute : ValidationAttribute
    {
        protected override ValidationResult IsValid(object? value, ValidationContext validationContext)
        {
            //获取类的示例对象
            var user = (User)validationContext.ObjectInstance;
            if (String.IsNullOrWhiteSpace(user.userName))
                return new ValidationResult("用户名不能为空", new[] { nameof(user.userName) });

            if (user.userName.Length > 10)
                return new ValidationResult("用户名太长", new[] { nameof(user.userName) });

            if (!String.IsNullOrWhiteSpace(user.userMobile))
            {
                var regex = new Regex(@"^1[3456789]\d{9}$");
                if ((!regex.IsMatch(user.userMobile)))
                    return new ValidationResult("用户手机号格式不正确", new[] { nameof(user.userMobile) });
            }
            else
            {
                return new ValidationResult("用户手机号为空", new[] { nameof(user.userMobile) });
            }
            return ValidationResult.Success;
        }
    }

②`将UserFilterValidationAtttibute声名到类上

[UserFilterValidation]//直接声明到类上
    public class User
    {
        
        public string userName { get; set; }
       
        public string userMobile { get; set; }
    }

③`请求Api的时候就会自动验证

 

 3`  方法三:使用FluentValidation进行验证

 优点:可以在任何场景使用,不会造成代码耦合,适合大项目使用(小项目前两种足   够)

①`引入Nuget包:FluentValidation.AspNetCore 

②`新建UserFilterValidation类继承AbstractValidator<模型类>,代码如下

public class UserFilterValidation : AbstractValidator<User>
    {
        public UserFilterValidation()
        {
            //设置为Stop,则在出现验证不符合就会立刻终止,不会往下执行
            //默认值为Continue
            CascadeMode = CascadeMode.Stop;
            RuleFor(x => x.userName).NotEmpty().WithMessage("用户名不能为空")
                                    .Length(2, 10).WithMessage("用户名最少2个字符,最多10个字符");
            RuleFor(x => x.userMobile).NotEmpty().WithMessage("手机号必填")
                                    .Length(11).WithMessage("手机号为11位")
                                    .Must(IsMobile).WithMessage("手机号格式不对");
        }
        //手机验证
        private bool IsMobile(string Mobile)
        {
            return Regex.IsMatch(Mobile, @"^1[3456789]\d{9}$");
        }
    }

③`使用UserFilterValidation

[HttpPost("Add")]
        public ApiResult AddUser(User user)
        {
            //实例一个接口返回对象(自己定义)
            ApiResult result = new ApiResult();
            //实例一个UserFilterValidation对象,当然可以使用IOC注入,就不演示了
            UserFilterValidation rules = new UserFilterValidation();
            //UserFilterValidation的结果
            ValidationResult validationResult = rules.Validate(user);
            if (validationResult.IsValid)
            {
                //校验通过
                result.code = 200;
                result.msg = "添加成功";
                result.success = true;
                result.data = user;
            }
            else
            {
                result.code = 500;
                result.msg = validationResult.ToString(",");

            }
            return result;
        }

本文到此结束,喜欢博主的话麻烦点点关注~~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值