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

.NET Core视图如何将@foreach遍历的列表作为数组参数传给控制器

问题:提交表单时无法将列表数据传递到HomeController

我在视图中从模型获取数据,通过@foreach遍历item.keys列表生成多个输入框用于更新数据,代码如下:

@foreach (var key in item.keys)
{
    <tr class="table table-hover table-responsive-sm display" style="color:white;">
        <td>@Html.TextBoxFor(a => key.keyName, new { @type = "text", maxlength = "50", required = "yes" })</td>
        <td>@Html.TextBoxFor(a => key.dataLength, new { @type = "number", min=1, max=32000, required = "yes" })</td>
        <td>@Html.TextBoxFor(a => key.dataDecLength, new { @type = "number", min=0, max=15, required = "yes" })</td>
        <td>@Html.TextBoxFor(a => key.rpgDataType, new { @type = "text", maxlength = "7", required = "yes" })</td>
        <td>@Html.TextBoxFor(a => key.sqlDataType, new { @type = "text", maxlength = "7", required = "yes" })</td>
    </tr>
}   

我希望点击提交按钮时,将几个独立的字符串值以及整个item.keys列表传递给HomeController的方法,但尝试用@using (Html.BeginForm)和带onclick事件的按钮都没效果,请问是使用方式有误吗?


解决方案

1. 核心问题:foreach无法生成正确的模型绑定name属性

用@foreach遍历生成的输入框,其name属性会被渲染成key.keyName这类格式,而ASP.NET MVC的模型绑定需要集合参数的name带索引(比如item.keys[0].keyName)才能识别为列表。这就是提交后控制器无法接收列表数据的原因。

2. 替换为for循环实现正确绑定

如果item.keys是IList类型(或可转换为List),直接用for循环遍历,这样TextBoxFor会自动生成带索引的name属性:

@using (Html.BeginForm("UpdateData", "Home", FormMethod.Post))
{
    <!-- 新增独立字符串输入框,name要和控制器参数名对应 -->
    <div>
        <label>参数1:</label>
        <input type="text" name="param1" required />
    </div>
    <div>
        <label>参数2:</label>
        <input type="text" name="param2" required />
    </div>

    <!-- 用for循环生成列表输入框 -->
    <table>
        @for (int i = 0; i < item.keys.Count; i++)
        {
            <tr class="table table-hover table-responsive-sm display" style="color:white;">
                <td>@Html.TextBoxFor(a => item.keys[i].keyName, new { @type = "text", maxlength = "50", required = "yes" })</td>
                <td>@Html.TextBoxFor(a => item.keys[i].dataLength, new { @type = "number", min=1, max=32000, required = "yes" })</td>
                <td>@Html.TextBoxFor(a => item.keys[i].dataDecLength, new { @type = "number", min=0, max=15, required = "yes" })</td>
                <td>@Html.TextBoxFor(a => item.keys[i].rpgDataType, new { @type = "text", maxlength = "7", required = "yes" })</td>
                <td>@Html.TextBoxFor(a => item.keys[i].sqlDataType, new { @type = "text", maxlength = "7", required = "yes" })</td>
            </tr>
        }
    </table>

    <button type="submit">提交数据</button>
}

3. 若item.keys是IEnumerable,先转为List

如果item.keys是IEnumerable类型(不支持索引访问),先在视图顶部转换为List:

@{
    var keyList = item.keys.ToList();
}

然后修改for循环的数据源:

@for (int i = 0; i < keyList.Count; i++)
{
    <tr>
        <td>@Html.TextBoxFor(a => keyList[i].keyName, ...)</td>
        <!-- 其他输入框同理修改为keyList[i].xxx -->
    </tr>
}

4. 控制器方法定义

确保控制器的Action参数名与表单输入框的name一致,列表参数类型要和item.keys的元素类型匹配(比如假设元素类型是KeyModel):

using System.Collections.Generic;
using System.Web.Mvc;

namespace YourNamespace.Controllers
{
    public class HomeController : Controller
    {
        [HttpPost]
        public ActionResult UpdateData(string param1, string param2, List<KeyModel> keys)
        {
            // 处理param1、param2和keys列表的业务逻辑
            // 比如保存到数据库等

            return RedirectToAction("Index"); // 处理完成后跳转
        }
    }

    // 确保KeyModel的属性名和视图中的key.xxx完全一致
    public class KeyModel
    {
        public string keyName { get; set; }
        public int dataLength { get; set; }
        public int dataDecLength { get; set; }
        public string rpgDataType { get; set; }
        public string sqlDataType { get; set; }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 20:38:33