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
相关产品推荐
相关产品推荐

