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

ASP.NET Core 5复杂模型数据绑定 新增嵌套列表项数据丢失问题

问题根本原因

HTTP协议本身是无状态的,Razor Pages的模型绑定仅会填充POST请求中实际提交的表单字段:

  1. 首次添加ResponsibleParty提交时,你将新对象追加到Project.ResponsibleParties后返回页面,视图仅负责渲染已添加的列表数据,并未将已添加的列表项字段包含在后续提交的表单中
  2. 第二次提交时,请求里没有之前添加的ResponsibleParties集合的相关字段,模型绑定自然无法为Project.ResponsibleParties填充历史数据,最终拿到的就是空集合或者仅包含本次提交的新数据

解决方案

方案1:表单内追加隐藏字段保留集合状态(适合数据量小的场景)

在Razor视图的表单标签内部,遍历已有的Project.ResponsibleParties,按ASP.NET Core集合绑定的命名规则生成隐藏字段,示例代码如下:

@for (int i = 0; i < Model.Project.ResponsibleParties.Count; i++)
{
    <input type="hidden" asp-for="Project.ResponsibleParties[i].ResponsiblePartyId" />
    <input type="hidden" asp-for="Project.ResponsibleParties[i].Name" />
    <!-- 其他需要保留的ResponsibleParty属性都对应加隐藏字段 -->
}

这些隐藏字段会随每次POST一起提交,模型绑定就能完整还原之前添加的所有ResponsibleParties数据。

方案2:服务端缓存Project状态(适合数据量较大的场景)

将已经编辑过的Project对象存储到Session或TempData中,避免每次提交都要传递全量集合数据:

  1. 配置Session支持(Program.cs/Startup.cs中添加builder.Services.AddSession();和app.UseSession();)
  2. POST处理逻辑示例:
public IActionResult OnPostAddResponsibleParty()
{
    Project existingProject;
    // 先从Session中读取之前保存的Project
    var projectJson = HttpContext.Session.GetString("CurrentEditingProject");
    if (projectJson != null)
    {
        existingProject = JsonSerializer.Deserialize<Project>(projectJson);
    }
    else
    {
        existingProject = Project;
        existingProject.ResponsibleParties ??= new List<ResponsibleParty>();
    }
    // 添加新的责任方
    existingProject.ResponsibleParties.Add(ResponsibleParty);
    // 重新保存到Session
    HttpContext.Session.SetString("CurrentEditingProject", JsonSerializer.Serialize(existingProject));
    // 绑定到页面对象用于渲染
    Project = existingProject;
    return Page();
}

注意使用TempData的话,每次读取后需要调用TempData.Keep("CurrentEditingProject")保留数据,避免单次请求后自动销毁。

方案3:AJAX异步提交(体验最优)

点击Add按钮时不触发整页提交,通过AJAX将新的ResponsibleParty数据传给后台接口,添加成功后直接用JS将新记录渲染到页面列表中,不需要来回传递Project的全量状态,也不会触发整页刷新。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 18:30:05