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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 20:22:10