编辑器模板中的单选按钮

Radio Buttons in Editor Template

我正在创建一个 'Progress Report',其中包含问题列表和多项选择答案。如果相关,问题将通过一个单独的无关过程自动填充到进度报告中。

代码如下: 编辑视图:

@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.) 是不是每个单选按钮都有不同的名称,这让我可以 select 一个问题的所有答案,而不是取消 select 一个,因为下一个是 select编辑。

2.) selected 答案应该在我下次编辑进度报告时加载为 selected。如何根据上次加载视图时提供的答案预先select加载其中一个答案。

3.) 如何 return selected 回复到我的 ProgressReport Controller 中的编辑操作?

非常感谢您的帮助

编辑控制器代码:

[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);
    }

您的问题是对 typeof PossibleAnswer 使用 EditorTemplateEditorFor() 方法旨在与集合一起使用,并向 属性 添加前缀和索引器,以便它可以通过 post 后面的 DefaultModelBinder 绑定到集合.第二个问题是您将单选按钮绑定到 PossibleAnswer 的 属性 AnswerText,而您应该绑定到 ReportAnswerAnswerID 属性 .

删除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 } 的用法一样)。没有更可靠的方法来保证模型绑定会失败:)