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

如何在ASP.NET MVC控制器中添加Answers表的响应数据

解决方案

1. 定义ViewModel封装数据

首先创建专用ViewModel,避免直接操作实体类,更清晰地关联问题与对应答案:

public class SurveyEditViewModel
{
    public Survey Survey { get; set; }
    public List<QuestionWithAnswerViewModel> Questions { get; set; }
}

public class QuestionWithAnswerViewModel
{
    public int QuestionId { get; set; }
    public string QuestionText { get; set; }
    public int Priority { get; set; }
    // 其他需要展示的问题属性
    public string AnswerValue { get; set; }
    public string AnswerComment { get; set; }
}

2. 修改控制器方法关联问题与答案

更新Edit方法,传入responseId拉取对应答案,用字典快速匹配问题与答案,自动处理“问题多于已提交答案”的空值场景:

[HttpGet]
public ActionResult Edit(int surveyId, int responseId)
{
    // 拉取调查基础信息
    var survey = _db.Surveys.Single(s => s.Id == surveyId);

    // 拉取该调查的所有有效问题,按优先级排序
    var activeQuestions = _db.Questions
                             .Where(q => q.SurveyId == surveyId && q.IsActive)
                             .OrderBy(q => q.Priority)
                             .ToList();

    // 拉取该response下的所有答案,用QuestionId做键存入字典
    var existingAnswers = _db.Answers
                             .Where(a => a.ResponseId == responseId)
                             .ToDictionary(a => a.QuestionId, a => a);

    // 构造带答案的问题列表,无对应答案则设为null
    var questionsWithAnswers = activeQuestions.Select(q => new QuestionWithAnswerViewModel
    {
        QuestionId = q.Id,
        QuestionText = q.Text,
        Priority = q.Priority,
        AnswerValue = existingAnswers.ContainsKey(q.Id) ? existingAnswers[q.Id].Value : null,
        AnswerComment = existingAnswers.ContainsKey(q.Id) ? existingAnswers[q.Id].Comment : null
    }).ToList();

    var viewModel = new SurveyEditViewModel
    {
        Survey = survey,
        Questions = questionsWithAnswers
    };

    return View(viewModel);
}

3. 视图层实现编辑逻辑

在视图中直接绑定ViewModel属性,无需额外空值判断,未完成的问题会显示空输入框:

@model SurveyEditViewModel

<h2>继续填写调查:@Model.Survey.Title</h2>

@using (Html.BeginForm("Edit", "Survey", FormMethod.Post))
{
    @Html.HiddenFor(m => m.Survey.Id)
    @Html.Hidden("responseId", /* 可从ViewBag或ViewModel新增属性传入 */)

    foreach (var question in Model.Questions.OrderBy(q => q.Priority))
    {
        <div class="survey-question">
            <h4>@question.QuestionText</h4>
            @Html.TextBoxFor(m => question.AnswerValue, new { @class = "answer-input", placeholder = "请输入答案" })
            @Html.TextAreaFor(m => question.AnswerComment, new { @class = "answer-comment", placeholder = "可选:添加备注" })
            @Html.HiddenFor(m => question.QuestionId)
        </div>
    }

    <button type="submit" class="save-btn">保存进度</button>
}

关键说明

  • 用Dictionary存储已有答案,通过QuestionId快速匹配,避免循环中重复查询数据库,提升性能。
  • ViewModel自动处理空值,视图层无需额外判断,未提交答案的问题会显示空输入框,用户可直接继续填写。
  • 方法新增responseId参数,确保拉取的是当前用户未完成的特定调查回答记录。

内容的提问来源于stack exchange,提问作者Dave Hoover

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 15:35:24