.NET Core复杂对象绑定异常:Questions列表字段无法接收值
- 检查循环渲染的索引格式
.NET Core的模型绑定对列表项的命名有强制要求,必须生成带连续整数索引的name属性(如Questions[0].Answer)。如果用foreach循环替代for循环,或者索引不连续(比如从1开始、中间断号),绑定会直接失败。正确的渲染写法示例:
@for (int i = 0; i < Model.Questions.Count; i++) { @Html.HiddenFor(m => m.Questions[i].QuestionId) @Html.TextBoxFor(m => m.Questions[i].Answer) }
确认列表项类的属性权限
CpdFeedbackQuestionAnswerModel的所有需要绑定的属性必须是公共可读写的(public get; set;),只读属性、私有属性或者仅设置了get的属性,模型绑定器无法完成赋值。校验表单提交的请求数据
打开浏览器开发者工具(F12),切换到Network标签查看提交的Form Data,确认每个列表项的name属性格式是否为Questions[N].XXX(N为连续的整数索引)。如果name格式不符合要求,后端无法识别并绑定到List集合。检查控制器方法的绑定配置
确保控制器方法用[HttpPost]修饰,参数直接使用CpdTestFeedbackFormModel model,不要添加[FromBody]特性(表单提交的是Form Data,而非JSON格式,[FromBody]仅适用于JSON/XML类型的请求体)。如果是AJAX提交,要保证请求的contentType为默认的application/x-www-form-urlencoded,不要随意改为application/json。排查自定义模型绑定器的干扰
如果项目中实现了自定义模型绑定器,可能会覆盖默认的集合绑定逻辑。可以暂时移除自定义绑定器进行测试,或者调整自定义逻辑以支持列表类型的绑定。确认视图模型的初始化状态
控制器返回视图时,必须确保model.Questions已完成初始化(比如model.Questions = new List<CpdFeedbackQuestionAnswerModel>()并添加对应数量的项)。如果渲染视图时Questions为null,生成的表单控件会缺失正确的name属性,导致提交后无法绑定。
内容的提问来源于stack exchange,提问作者paria shiri

