我正在制作一份进度报告'提供问题列表和多项选择答案。如果相关,问题将通过单独的无关过程自动填充到进度报告中。
代码如下: 编辑视图:
@model App.Models.ProgressReport
@Html.EditorFor(model => model.ReportAnswers)
ReportAnswer.cshtml EditorTemplate(显示问题和进度报告的答案):
@model App.Models.ReportAnswer
<h3>
Question
</h3>
<p>
@Html.DisplayFor(x => x.Question.QuestionText)
</p>
<p>
@Html.EditorFor(x => x.Question.PossibleAnswers)
</p>
<p>
@Html.LabelFor(x => x.AnswerID)
@Html.TextBoxFor(x => x.AnswerID)
</p>
PossibleAnswer.cshtml(编辑模板,显示问题的所有可用答案):
@model App.Models.PossibleAnswer
<p>
@Html.DisplayFor(x => x.AnswerText)
@Html.RadioButtonFor(x => x.AnswerText, Model.AnswerID, new { Name =Model.QuestionID })
</p>
因此,这会显示“进度报告”和可选答案中的所有相关问题。
我的问题:
1。)每个单选按钮是否有不同的名称,允许我选择单个问题的所有答案,而不是在选择下一个问题时取消选择一个。
2。)下次编辑进度报告时,所选答案应加载为选中状态。如何根据上次加载视图时提供的答案,在加载时预先选择其中一个答案。
3.如何将所选答案返回到ProgressReport控制器中的“编辑”操作?
非常感谢帮助
EditController代码:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "ReportID,ClientID,ReportDateSubmitted,ReportWeek")] ProgressReport progressReport)
{
if (ModelState.IsValid)
{
db.Entry(progressReport).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.ClientID = new SelectList(db.Clients, "ClientID", "ID", progressReport.ClientID);
return View(progressReport);
}
答案 0 :(得分:3)
您的问题是对EditorTemplate
类型使用PossibleAnswer
。 EditorFor()
方法旨在处理集合并向属性添加前缀和索引器,以便它可以在帖子后面由DefaultModelBinder
绑定到集合。第二个问题是,当您应绑定AnswerText
PossibleAnswer
的{{1}}属性时,将单选按钮绑定到AnswerID
的属性ReportAnswer
。
删除PossibleAnswer.cshtml
文件并将ReportAnswer.cshtml
修改为
@model App.Models.ReportAnswer
<h3>Question</h3>
<p>@Html.DisplayFor(x => x.Question.QuestionText)</p>
@foreach(var answer in Model.Question.PossibleAnswers)
{
var id = string.Format("answer-{0}", answer.AnswerID);
<p>
@Html.RadioButtonFor(m => m.AnswerID, answer.AnswerID, new { id = id })
<label for="@id">@answer.AnswerText</label>
</p>
}
这将生成看起来像
的html<input type="radio" id="answer-1" name="[0].AnswerID" value="1" />
<label for="answer-1">Answer 1</label>
<input type="radio" id="answer-2" name="[0].AnswerID" value="2" />
<label for="answer-2">Answer 2</label>
附注:从不尝试覆盖name
属性(与new { Name = Model.QuestionID }
的使用情况一样。没有可靠的方法来保证模型绑定失败:)< / p>