ASP.NET Core无法将表格数据传递至Controller,集合始终为空
问题排查与解决步骤
1. 确认表单字段命名规则
MVC模型绑定对集合类型的字段命名有严格要求,必须采用**[索引下标].属性名**的格式,比如:
<input type="text" name="[0].ModuleName" value="模块1" /> <input type="checkbox" name="[0].IsEnabled" checked /> <input type="text" name="[1].ModuleName" value="模块2" /> <input type="checkbox" name="[1].IsEnabled" />
- 索引必须从0开始,连续无间隔,跳号(比如0、1、3)会导致后续数据无法被绑定
- 动态新增行时,要保证新行的索引是当前最大索引+1,不能用随机数或非连续值
2. 检查Model类属性的可访问性
确保ModuleMaster类的属性是public且包含get/set方法,否则模型绑定无法为属性赋值:
public class ModuleMaster { public string ModuleName { get; set; } public bool IsEnabled { get; set; } // 其他需要绑定的属性同理 }
3. 验证表单提交的请求数据
用浏览器开发者工具(F12)查看Network标签下的Form Data:
- 确认提交的字段名严格符合
[索引].属性名格式 - 检查是否存在字段拼写错误(比如属性名是
ModuleCode,表单里写的是ModuleCd),或字段被遗漏
4. 检查Controller方法的参数定义
确保Create方法的参数为IList<ModuleMaster>或List<ModuleMaster>,且未添加[FromBody]特性(MVC默认采用表单绑定,无需该特性):
[HttpPost] public ActionResult Create(IList<ModuleMaster> moduleList) { // 业务逻辑处理 }
如果是嵌套在ViewModel中的集合,表单字段名要加上ViewModel的属性前缀,比如:
public class UserRightsViewModel { public IList<ModuleMaster> Modules { get; set; } }
对应的表单字段名应为Modules[0].ModuleName
5. 排查动态生成行的JS逻辑
如果通过JS动态添加表格行,要保证生成的input元素name属性正确:
// 获取当前表格的有效行数(排除表头) var rowCount = document.getElementById('moduleTable').querySelectorAll('tr:not(.header)').length; // 生成新行的索引为当前行数(从0开始) var newRow = `<tr> <td><input type="text" name="[${rowCount}].ModuleName" /></td> <td><input type="checkbox" name="[${rowCount}].IsEnabled" /></td> </tr>`; // 将新行插入表格 document.getElementById('moduleTable').querySelector('tbody').insertAdjacentHTML('beforeend', newRow);
- 禁止使用
foreach生成的item.Property命名格式,必须手动指定连续索引
6. 检查表单元素的有效性
- 禁用(
disabled)的input元素不会被提交,若需保留禁用状态同时提交数据,改用readonly属性 - 所有需要提交的表单元素必须包裹在
<form>标签内部,否则不会被纳入提交的Form Data中
内容的提问来源于stack exchange,提问作者Anil Kumar
相关产品推荐
相关产品推荐

