Fork me on GitHub

.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);
        }

 

posted @ 2018-11-01 17:53  龙码精神  阅读(2925)  评论(0编辑  收藏  举报