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

MVC框架下无JS实现在线测试页面单选响应带键入库方案问询

当然可以实现!完全不用JavaScript也能搞定这个需求,咱们一步步来拆解:

核心思路:利用ASP.NET MVC模型绑定+后端存储

要在数据库里保存带键的测试响应,关键是把测试题编号(作为键)和选中的答案值绑定起来,通过后端逻辑持久化到数据库,全程不需要JS介入。

1. 设计响应存储的实体类

首先创建一个专门的实体类,用来映射数据库表,存储每一道题的响应数据:

public class TestResponse
{
    public int Id { get; set; }
    // 可选:关联用户ID,区分不同用户的答卷
    public string UserId { get; set; }
    // 测试题编号(对应你代码里的item.TestNumber,作为唯一键)
    public int TestNumber { get; set; }
    // 选中的答案值(对应单选框的value,比如你示例里的2)
    public int SelectedAnswerValue { get; set; }
    // 可选:关联试卷ID,区分不同测试批次
    public int ExamId { get; set; }
}

把这个实体添加到你的DbContext中,生成对应的数据库表即可。

2. 调整ViewModel适配批量提交

你的ViewModel需要能收集所有题目的答案,推荐用字典来存储「题编号-选中值」的键值对:

public class TestSubmissionViewModel
{
    public int ExamId { get; set; }
    // 字典键=TestNumber,值=选中的答案值
    public Dictionary<int, int> Answers { get; set; } = new Dictionary<int, int>();
    
    // 保留你原有的Course等属性,按需调整
}

3. 改造视图中的单选框代码

你原来手动指定@Name的写法可能会破坏模型绑定,改成适配字典的写法,让MVC自动帮你完成绑定:

@model TestSubmissionViewModel

@foreach (var item in Model.TestQuestions) { <!-- 假设你有TestQuestions列表存储所有题目 -->
    <div class="question-block">
        <h5>题目@item.TestNumber:@item.QuestionText</h5>
        <!-- 绑定到Answers字典,自动关联TestNumber作为键 -->
        @Html.RadioButtonFor(m => m.Answers[item.TestNumber], 1) @item.AnswerOne
        @Html.RadioButtonFor(m => m.Answers[item.TestNumber], 2) @item.AnswerTwo
        @Html.RadioButtonFor(m => m.Answers[item.TestNumber], 3) @item.AnswerThree
        <!-- 更多选项依此类推 -->
    </div>
}

<!-- 用表单提交到后端Action -->
@using (Html.BeginForm("SubmitTest", "Test", FormMethod.Post))
{
    @Html.HiddenFor(m => m.ExamId)
    <button type="submit" class="submit-btn">提交答卷</button>
}

这样用户提交时,MVC会自动把每个题的选中值填充到ViewModel的Answers字典里,完全不需要JS。

4. 后端Action处理存储逻辑

在Controller里写一个接收提交的Action,把ViewModel中的数据转成TestResponse实体,批量保存到数据库:

[HttpPost]
public ActionResult SubmitTest(TestSubmissionViewModel viewModel)
{
    if (ModelState.IsValid)
    {
        // 获取当前用户ID(不需要用户关联可跳过)
        var userId = User.Identity.GetUserId();
        
        foreach (var answerPair in viewModel.Answers)
        {
            var response = new TestResponse
            {
                UserId = userId,
                ExamId = viewModel.ExamId,
                TestNumber = answerPair.Key,
                SelectedAnswerValue = answerPair.Value
            };
            
            db.TestResponses.Add(response);
        }
        
        db.SaveChanges();
        return RedirectToAction("TestCompleted");
    }
    
    // 验证失败,返回视图让用户重新填写
    return View(viewModel);
}

额外小提示

  • 如果测试题有多种类型(单选、多选),可以在TestResponse里加QuestionType字段,方便后续扩展。
  • 可以给ViewModel加验证规则,比如用自定义属性确保所有题目都被选中,通过ModelState.IsValid拦截未完成的答卷。

这套方案全程不需要JavaScript,就能把带键的响应数据稳稳存在数据库里啦!

内容的提问来源于stack exchange,提问作者np Ebrahimi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:34:38