FluentValidation模型状态无效时未自动拒绝请求 如何获取自定义错误消息
方案1:在Controller接口中直接读取自定义错误消息
你可以直接遍历ModelState的错误集合,提取你在验证器中用WithMessage设置的自定义消息,示例代码如下:
[HttpPost("register")] public IActionResult Register([FromBody] RegisterUserRequest request) { if (!ModelState.IsValid) { // 提取所有自定义错误消息 var errors = ModelState.Values .SelectMany(v => v.Errors) .Select(e => e.ErrorMessage) .ToList(); // 可按照业务需要自定义返回格式 return BadRequest(new { Code = 400, Errors = errors }); } // 后续正常业务逻辑 }
如果需要同时获取错误对应的请求字段名,可以用以下写法:
var errors = ModelState .Where(m => m.Value.Errors.Any()) .ToDictionary( k => k.Key, v => v.Value.Errors.Select(e => e.ErrorMessage).ToList() );
方案2:全局统一拦截返回错误消息(无需每个Controller重复写判断逻辑)
如果你希望所有接口的验证错误都统一返回格式,可以自定义Action过滤器实现自动处理:
- 先定义过滤器类:
public class ValidateModelStateFilter : IActionFilter { public void OnActionExecuting(ActionExecutingContext context) { if (!context.ModelState.IsValid) { var errors = context.ModelState.Values .SelectMany(v => v.Errors) .Select(e => e.ErrorMessage) .ToList(); context.Result = new BadRequestObjectResult(new { Code = 400, Message = "参数验证失败", Errors = errors }); } } public void OnActionExecuted(ActionExecutedContext context) { } }
- 在
Startup.cs中注册过滤器即可:
services.AddControllers(options => { options.Filters.Add<ValidateModelStateFilter>(); }) .AddFluentValidation(s => { s.RegisterValidatorsFromAssemblyContaining<Startup>(); });
配置完成后所有接口触发FluentValidation验证失败时,都会自动返回你设置的自定义错误消息,不需要在每个接口里手动处理ModelState。
注意说明
FluentValidation默认会自动把你通过WithMessage设置的自定义内容填充到ModelState的ErrorMessage字段,只要你验证器的注册逻辑正确,不需要额外配置就能直接读取到自定义错误文本,不会返回系统默认的验证提示。
内容的提问来源于stack exchange,提问作者tokechu
相关产品推荐
相关产品推荐

