ASP.NET MVC中隐藏字段传递List无法绑定至控制器问题
常见原因及排查方案:
字段命名格式不匹配
ASP.NET MVC 默认模型绑定要求集合字段遵循[集合参数名][索引].[属性名]的格式(比如PatientPrescriptionOTCModelList[0].DrugId)。需确认:- 控制器方法中集合参数的名称,与前端隐藏字段的
name属性前缀完全一致; - 模型类(
PatientPrescriptionOTCModel)的属性名,与name属性中的属性部分大小写完全匹配(绑定器区分大小写)。
- 控制器方法中集合参数的名称,与前端隐藏字段的
集合索引不连续
模型绑定器仅识别从0开始的连续整数索引。如果前端生成的字段索引出现跳号(比如[0]、[2]),绑定器会忽略跳号后的项,甚至导致整个集合绑定为空。检查JavaScript生成字段时的索引逻辑,确保索引连续递增。隐藏字段不在表单范围内
只有<form>标签内的字段会被提交。确认所有集合相关的隐藏字段都渲染在表单内部,同时对照网络面板的payload,确认所有集合字段都被包含在提交数据中。模型类缺少无参构造函数
ASP.NET MVC 绑定器需要目标模型类(PatientPrescriptionOTCModel)有公共无参构造函数,否则无法实例化对象,导致集合项无法被创建。检查模型类是否定义了无参构造,若仅存在带参构造,需补充无参构造。属性访问权限不足
确保PatientPrescriptionOTCModel的属性都是public修饰,且同时具备get和set方法。绑定器无法访问私有属性或只读属性,会导致属性值无法绑定,甚至集合项无法添加。JS生成字段的
name属性错误
部分前端代码仅设置隐藏字段的id属性,未正确设置name属性。比如错误写法:$('<input>').attr('id', 'PatientPrescriptionOTCModelList_0__Id'),正确写法需同时设置name="PatientPrescriptionOTCModelList[0].Id",绑定器仅通过name属性识别字段。模型验证失败
若集合项的属性不符合验证规则(比如必填项为空),绑定器会丢弃无效项,导致集合计数为0。可在控制器中通过ModelState.Values.SelectMany(v => v.Errors)查看具体验证错误信息。
内容的提问来源于stack exchange,提问作者ravi

