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
相关产品推荐
相关产品推荐

