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

