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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 05:00:49