EF Core(.NET Core)如何遍历日期范围批量添加考试详情条目
实现方案
你的思路完全可行,按以下步骤开发即可:
1. 新增考试详情录入页GET接口
在Exam对应的控制器中添加接口,点击「add detail」按钮时跳转到此接口,逻辑是先查询对应考试的起止日期,生成区间内的全量日期列表,同时查询所有可选课程传给视图供下拉选择:
public IActionResult AddExamDetails(int eid) { // 校验考试主记录是否存在 var targetExam = _context.ExamModels.FirstOrDefault(e => e.s_no == eid); if (targetExam == null) return NotFound(); // 生成考试周期内所有日期集合 var examDateRange = new List<DateOnly>(); for (var currentDate = targetExam.start_date; currentDate <= targetExam.end_date; currentDate = currentDate.AddDays(1)) { examDateRange.Add(currentDate); } // 传递课程列表、当前考试ID到视图 ViewBag.CourseList = _context.CourseModels.ToList(); ViewBag.ExamId = eid; return View(examDateRange); }
2. 开发批量录入视图
新建AddExamDetails.cshtml视图,按照MVC集合绑定的规则命名表单控件,确保提交时框架能自动识别多组详情数据为列表格式:
@model List<DateOnly> @{ ViewData["Title"] = "录入考试安排详情"; var courses = ViewBag.CourseList as List<CourseModel>; var examId = (int)ViewBag.ExamId; } <h4>考试周期:@Model.Min().ToString("yyyy-MM-dd") 至 @Model.Max().ToString("yyyy-MM-dd")</h4> <form asp-action="SaveExamDetails" method="post"> @Html.AntiForgeryToken() <input type="hidden" name="eid" value="@examId" /> <table class="table table-striped table-bordered mt-3"> <thead> <tr> <th width="15%">考试日期</th> <th width="30%">考试课程</th> <th width="15%">开考时间</th> <th width="20%">满分</th> <th width="20%">及格分</th> </tr> </thead> <tbody> @for (var i = 0; i < Model.Count; i++) { <tr> <td> @Model[i].ToString("yyyy-MM-dd") @* 隐藏域绑定日期和考试ID,不需要用户手动输入 *@ <input type="hidden" name="[@i].exam_date" value="@Model[i].ToString("yyyy-MM-dd")" /> <input type="hidden" name="[@i].eid" value="@examId" /> </td> <td> <select name="[@i].cid" class="form-select" required> <option value="">请选择课程</option> @foreach (var course in courses) { <option value="@course.s_no">@course.name</option> } </select> </td> <td> <input type="time" name="[@i].time" class="form-control" required /> </td> <td> <input type="number" name="[@i].full_marks" class="form-control" min="0" required /> </td> <td> <input type="number" name="[@i].pass_marks" class="form-control" min="0" required /> </td> </tr> } </tbody> </table> <div class="mt-3"> <button type="submit" class="btn btn-primary">提交所有考试安排</button> <a asp-action="Index" class="btn btn-outline-secondary ms-2">返回考试列表</a> </div> </form>
注意:控件名统一使用
[索引].字段名的格式是MVC 6自动绑定集合类型参数的必要规则,不要修改命名格式,否则后台无法接收到完整的多组数据。
3. 新增批量保存接口
添加POST接口接收提交的批量数据,直接调用EF Core的批量新增方法存入数据库即可:
[HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> SaveExamDetails(int eid, List<ExamDetailsModel> examDetails) { // 基础校验不通过时返回录入页 if (!ModelState.IsValid) { return RedirectToAction(nameof(AddExamDetails), new { eid }); } // 批量写入考试详情 _context.ExamDetailsModels.AddRange(examDetails); await _context.SaveChangesAsync(); return RedirectToAction("Index"); }
4. 列表页添加入口
在考试列表(Index视图)的每条Exam记录操作列,添加「add detail」跳转按钮:
<a asp-action="AddExamDetails" asp-route-eid="@item.s_no" class="btn btn-sm btn-info">add detail</a>
可选优化点
- 如果不需要给周期内每天都安排考试,可以给每一行增加勾选框,提交时后台过滤掉未勾选行的数据即可
- 如果考试周期跨度超过30天,不建议一次性渲染所有日期表单,可以改为动态添加行、按周分页加载的交互,避免页面加载过慢
- 提交前可以加前端JS校验,比如限制及格分不能大于满分、同一天不能安排重复课程等,减少无效提交
- 如果需要在新增Exam主记录的同流程直接录入详情,可以在现有
AddExam方法保存成功拿到Exam主键ID后,直接返回AddExamDetails视图,不需要跳转回列表
内容的提问来源于stack exchange,提问作者Nischal Uzumaki Khatiwada
相关产品推荐
相关产品推荐

