如何结合foreach实现多下拉选框数据批量插入?
解决方案:批量提交多行下拉选框数据到数据库
要实现单按钮批量提交所有学生的课堂时长选择,核心是把所有行的表单元素归到同一个表单中,并让ASP.NET MVC能自动绑定多行数据到集合里。下面是具体的修改步骤:
1. 创建批量数据模型类
首先添加一个模型类,用来封装每行学生的课堂时长数据:
public class StudentMinutesModel { public int ClassID { get; set; } public int SID { get; set; } public string FullName { get; set; } public int Minutes { get; set; } }
2. 修改View代码:单表单包裹所有行
把原来每行一个表单的结构,改成整个表格包裹在单个表单内,并调整表单元素的name属性,让MVC能识别批量数据:
<div class="table-responsive"> <div style="margin-top:20px;"> @using (Html.BeginForm("Index", "Minutes", FormMethod.Post)) { <table id="tablereport" class="table table-striped table-bordered table-hover table-condensed"> <thead style="background-color:black; font-weight:bold; color:aliceblue"> <tr> <th>ClassID</th> <th>SID</th> <th>FullName</th> <th>Minutes</th> </tr> </thead> <tbody> @for (int i = 0; i < ViewBag.general.Rows.Count; i++) { var dr = ViewBag.general.Rows[i]; <tr> <td> @dr["ClassID"] @Html.Hidden($"MinutesList[{i}].ClassID", dr["ClassID"]) </td> <td> @dr["SID"] @Html.Hidden($"MinutesList[{i}].SID", dr["SID"]) </td> <td> @dr["FullName"] @Html.Hidden($"MinutesList[{i}].FullName", dr["FullName"]) </td> <td> @Html.DropDownList($"MinutesList[{i}].Minutes", new List<SelectListItem> { new SelectListItem{ Text="50", Value = "50" }, new SelectListItem{ Text="40", Value = "40" }, new SelectListItem{ Text="30", Value = "30" }, new SelectListItem{ Text="20", Value = "20" }, new SelectListItem{ Text="10", Value = "10" }, }) </td> </tr> } </tbody> </table> <div> <input type="submit" id="formsubmit" name="submit" value="Insert" class="btn btn-default"> </div> } </div> </div>
关键修改说明:
- 将
Html.BeginForm移到表格外部,所有行的表单元素都属于同一个表单 - 使用
for循环遍历数据,通过索引i构建表单元素的name属性(如MinutesList[{i}].Minutes),这是MVC批量绑定的规则 - 用隐藏字段
Hidden存储ClassID、SID、FullName,这些数据需要提交但不需要用户修改
3. 修改Controller:接收批量数据并循环插入
更新Post方法,接收集合类型的参数,遍历插入每条数据:
public class MinutesController : Controller { // GET: Minutes public ActionResult Index() { // 保持原有逻辑,从存储过程获取数据赋值给ViewBag.general return View(); } [HttpPost] public ActionResult Index(List<StudentMinutesModel> minutesList) { if (minutesList != null && minutesList.Any()) { var db = new DB(); foreach (var item in minutesList) { db.InsertMinutes(item.ClassID, item.Minutes, item.SID, item.FullName); } } // 批量提交后重定向回列表页 return RedirectToAction("Index"); } }
关键修改说明:
- Post方法参数改为
List<StudentMinutesModel> minutesList,MVC会自动把表单提交的多行数据绑定到这个集合 - 遍历集合中的每个元素,调用插入方法完成批量存储
- 移除了原有的单个参数重定向,批量提交后直接返回列表页即可
内容的提问来源于stack exchange,提问作者DilbarC
相关产品推荐
相关产品推荐

