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

ASP.NET Core 6 MVC中如何将List<string>随模型回传至控制器?

如何在ASP.NET Core视图中让列表随模型回传至控制器

问题描述

我有如下模型类:

public class MyModel
{
    public int id { get; set; }
    public string? Name { get; set; }
    public List<string?> Stage { get; set; } = new List<string?>();
}

我已通过以下代码从控制器将模型传递至视图,且能在视图中遍历列表:

public IActionResult EnterBudgetDetails(CreateABudgetPageModel obj)
{
    obj.Stage.Add("Initial");
    obj.Stage.Add("Test1");
    obj.Stage.Add("Test2");

    return View(obj);     
}

但不清楚如何设置视图,才能让更新后的Stage列表随模型回传至控制器。我尝试了以下代码但无效:

@if (Model != null)
{
    for (var i = 0; i < Model.Stage.Count; i++)
    {
         <input type="hidden" asp-for="Stage[i]" value="@Model.Stage[i]" />
    }
}

正确实现方式

要让列表成功回传,需注意以下核心要点:

1. 用表单包裹所有需回传的字段

只有<form>标签内的元素才会在提交时被发送到控制器,需指定正确的提交动作和请求方法。

2. 正确使用asp-for生成绑定字段

ASP.NET Core的模型绑定依赖索引化的字段名称(如Stage[0]、Stage[1]),for循环能正确生成这种格式的字段。无需手动指定value属性,asp-for会自动绑定模型当前值,手动赋值反而可能导致绑定冲突。

3. 控制器需添加对应POST动作方法

回传需要专门的POST方法接收模型参数。

完整视图代码示例

@model CreateABudgetPageModel

<!-- 指定提交到目标控制器动作 -->
<form asp-action="EnterBudgetDetails" method="post">
    @if (Model != null)
    {
        @for (var i = 0; i < Model.Stage.Count; i++)
        {
            <!-- 自动生成正确的name和value,无需手动指定value -->
            <input type="hidden" asp-for="Stage[i]" />
            
            <!-- 如果需要允许用户修改Stage项,可替换为文本框: -->
            <!-- <input type="text" asp-for="Stage[i]" class="form-control" /> -->
        }
    }

    <button type="submit" class="btn btn-primary">提交</button>
</form>

对应的控制器POST方法

[HttpPost]
public IActionResult EnterBudgetDetails(CreateABudgetPageModel obj)
{
    // 此时obj.Stage已包含回传的列表数据
    // 执行业务逻辑,比如保存到数据库等

    return View(obj);
}

原代码无效的原因

你手动添加的value="@Model.Stage[i]"会和asp-for自动生成的value值冲突,干扰模型绑定的识别逻辑。另外,如果这些hidden字段不在<form>标签内,提交时也不会被发送到控制器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 19:22:58