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

将列表从View传递至Controller Action时List计数为0的问题

问题描述

我有如下HttpPost端点:

[HttpPost]
public async Task<IActionResult> Save(myViewModel viewModel)
{
  ....
}

我的ViewModel包含一个列表:

public class MyViewModel
{
    public List<Record> Records {get;set;}
}

public class Record
{
    public Guid RecordId{ get; set; }
    public String Name{ get; set; }
}

(注:原代码中List<Records>应为笔误,修正为List<Record>)

当我通过cshtml表单将数据传递到Action时,列表的计数显示为:

count = 0 

但我确定至少有一条记录,我的表单代码如下:

<form>
    <div class="modal-footer">
        @foreach(var rec in Model.Records)
        {
            <input type="hidden" name = "Records" value="@rec" asp-for="Records" />
        }
    <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
        <button type="submit" class="btn btn-primary" id="confirm">Confirm</button>
    </div>
</form>

问题原因及解决办法

你的表单写法不符合ASP.NET Core模型绑定规则,导致列表无法被正确识别绑定。

错误点:

  1. 直接把@rec作为value值,ASP.NET Core无法将对象的字符串表示反序列化为Record实例。
  2. asp-for="Records"和手动指定name="Records"重复,且未为列表项指定索引和具体属性,模型绑定器无法解析列表结构。

正确写法:

需要为列表中每个对象的属性生成带索引的表单字段,让绑定器能识别列表结构。

方法一:使用for循环(适用于支持索引的集合)
<form method="post">
    <div class="modal-footer">
        @for (int i = 0; i < Model.Records.Count; i++)
        {
            <input type="hidden" asp-for="Records[i].RecordId" />
            <input type="hidden" asp-for="Records[i].Name" />
        }
        <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
        <button type="submit" class="btn btn-primary" id="confirm">Confirm</button>
    </div>
</form>
方法二:使用EditorTemplate(更优雅,适合复杂对象)
  1. 在Views/Shared/EditorTemplates目录下创建Record.cshtml:
@model Record
<input type="hidden" asp-for="RecordId" />
<input type="hidden" asp-for="Name" />
  1. 在表单中调用模板:
<form method="post">
    <div class="modal-footer">
        @Html.EditorFor(m => m.Records)
        <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
        <button type="submit" class="btn btn-primary" id="confirm">Confirm</button>
    </div>
</form>

额外注意:

  • 表单必须添加method="post"属性,否则默认会发起Get请求,无法触发HttpPost端点。
  • 确保Get请求返回视图时,ViewModel的Records列表已被正确初始化并赋值,否则循环不会生成任何字段。

内容的提问来源于stack exchange,提问作者dros

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 11:01:12