zoukankan      html  css  js  c++  java
  • .NetCore使用FluentValidation实现友好验证提示

    Nuget包导入FluentValidation.AspNetCore

    官方的用法是在services中添加如下来操作

     services.AddMvc().AddFluentValidation(config=> {
                   
    
                });

    但是个人感觉这种把在验证提示信息不是太友好,比如他的格式往往是这样

    多个都触发的情况

    因为这是后台触发的验证,抛开前端验证不说,如果触发api接口验证后,提示出来上面的信息,在前端提示有点麻烦,因为后台还有可能出现错误情况或者其他失败情况,格式跟错误格式不一样,前端还要分别处理,所以处理起来不方便

    这里我没有使用上面的方式添加服务,通过前面文章中的注入,我自己注入了模型的验证服务

    重新封装了下验证触发后的返回结果 统一封装在OperatorResult类中,与接口本生发生错误返回的结果一致,这样前端就不必为了区分验证提示还是异常提示或者保存失败提示,只需要提示封装的信息即可

     下面是我验证类,关于ScopedDI属性标签在前面的文章中有介绍,这样我不需要在ConfigServices中添加任何代码了

      [ScopedDI]
        public class SchoolDtoValidator : AbstractValidator<SchoolDto>
        {
            public SchoolDtoValidator()
            {
              
                RuleFor(x => x.Name).NotEmpty().WithMessage("学校名不能为空");
                RuleFor(x => x.Address).NotEmpty().WithMessage("地址不能为空");
            }
           
        }

    接下来就是在Controller中DI上我们的验证

            IValidator<SchoolDto> _validator;
       
            /// <summary>
            /// 构造函数
            /// </summary>
    
            /// <param name="validator"></param>
    
            public DemoController( IValidator<SchoolDto> validator)
            {
                _validator = validator;
            
    
            }

    在相关业务代码中处理下即可,前端只需要根据ResultType判断,提示Message就行了

      public async Task<IActionResult> CreateData([FromBody]SchoolDto model)
            {
                var result = new OperatorResult(ResultType.Fail);
                var validationResult = _validator.Validate(model);
                if (!validationResult.IsValid)
                {
                    result.Message = string.Join(";", validationResult.Errors);
                    return Ok(result);
                }
                try
                {
                    var school = _mapper.Map<SchoolDto, School>(model);
                    school.Id = Guid.NewGuid();
                    school.AddClassesDomain(new Classes { CName = "Demo", Id = Guid.NewGuid() });
                    var command = new DemoCreateCommand { com_school = school };
                    result = await _mediator.Send(command);
                }
                catch
                {
                    result.Message = "操作失败";
                }           
                return Ok(result);
            }
  • 相关阅读:
    qt creator配置qt versions: 使用从别处拷贝来的qt库时遇到的问题
    linux显示bmp图像
    gcc预处理、编译、汇编、链接
    佛山照明选股思路
    公共函数瑜伽
    函数防抖和节流*(性能优化不错的选择)
    阮一峰的网络日志有感2(面向对象编程)
    阮一峰的网络日志有感
    项目遇到的问题总结(四):单页面首屏加载慢解决方案
    项目遇到的问题总结(三):数组里面的对象重复了,要去重;reduce去重
  • 原文地址:https://www.cnblogs.com/liyouming/p/9890744.html
Copyright © 2011-2022 走看看