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

ASP.NET Core Web API中模型验证时ModelState.RawValue始终为null

ModelState.RawValue 始终为null的原因及解决办法

原因分析

  • 模型绑定未完成:若在模型绑定流程结束前(比如早期过滤器阶段)执行代码,RawValue还未被赋值。
  • 复杂类型绑定限制:对于嵌套对象等复杂类型,ASP.NET Core不会为其填充RawValue,仅顶层简单属性可能有值。
  • 自定义验证时机错误:手动提前触发验证逻辑,此时ModelState尚未收集到RawValue。

替代解决方案

放弃依赖RawValue,改用ModelEntry.AttemptedValue,它专门存储用户提交的原始输入值,不受绑定结果影响。修改后的代码如下:

protected Error GenerateError()
{
    Error error = new Error();
    var details = new List<Detail>();

    if (!ModelState.IsValid)
    {
        foreach (var keyValuePair in ModelState)
        {
            var entry = keyValuePair.Value;
            if (entry.ValidationState == ModelValidationState.Invalid)
            {
                var detail = new Detail()
                {
                    Field = keyValuePair.Key,
                    Value = entry.AttemptedValue,
                    Issues = entry.Errors.Select(o => o.ErrorMessage).ToList()
                };

                details.Add(detail);
            }
        }

        error.Details = details;
    }

    return error;
}

额外注意事项

  • 确保代码在模型绑定完成后执行,比如Action方法内部或ActionExecutingContext阶段的过滤器中。
  • 若API使用[FromBody]绑定复杂JSON对象,AttemptedValue也可能为空,此时可通过中间件提前读取并保存原始请求体内容,生成错误时直接使用该内容。

内容的提问来源于stack exchange,提问作者Hans Info

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 05:12:29