如何从ModelState中获取单个字段的错误消息?
实现必填字段单独错误提示的方案
可行,你可以通过解析聚合错误消息并手动拆分到对应字段的方式,实现每个必填字段返回单独错误。
默认情况下,System.Text.Json反序列化缺失必填字段时,会生成一条聚合错误消息。你需要在ModelState中处理这条错误,将其拆分为单个字段的错误:
步骤1:创建自定义Action过滤器
public class SplitRequiredPropertiesErrorFilter : IActionFilter { public void OnActionExecuting(ActionExecutingContext context) { // 筛选出聚合的必填字段错误 var requiredAggregateErrors = context.ModelState.Values .SelectMany(v => v.Errors) .Where(e => e.ErrorMessage.Contains("missing required properties")) .ToList(); foreach (var aggregateError in requiredAggregateErrors) { // 提取错误消息中的字段列表 var fieldListStart = aggregateError.ErrorMessage.IndexOf("including the following: ") + "including the following: ".Length; var fieldNames = aggregateError.ErrorMessage.Substring(fieldListStart) .Split(", ") .Select(f => f.Trim()) .ToList(); // 为每个字段添加单独错误 foreach (var field in fieldNames) { context.ModelState.TryAddModelError(field, $"必填字段 {field} 未提供"); } // 移除原聚合错误 var errorKey = context.ModelState.Keys.First(k => context.ModelState[k].Errors.Contains(aggregateError)); context.ModelState[errorKey].Errors.Remove(aggregateError); if (!context.ModelState[errorKey].Errors.Any()) { context.ModelState.Remove(errorKey); } } } public void OnActionExecuted(ActionExecutedContext context) { } }
步骤2:注册过滤器
在Program.cs中添加过滤器到控制器配置:
builder.Services.AddControllers(options => { options.Filters.Add<SplitRequiredPropertiesErrorFilter>(); });
效果
处理完成后,你原来的代码:
var modelStateErrors = context.ModelState.Values.SelectMany(m => m.Errors);
就能获取到每个必填字段对应的单独错误消息,每条错误对应一个缺失的字段。
内容的提问来源于stack exchange,提问作者Anton Putau
相关产品推荐
相关产品推荐

