如何在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
相关产品推荐
相关产品推荐

