You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 03:14:56