编辑器模板中的单选按钮

时间:2015-06-09 15:54:59

标签: asp.net-mvc radio-button survey mvc-editor-templates

我正在制作一份进度报告'提供问题列表和多项选择答案。如果相关,问题将通过单独的无关过程自动填充到进度报告中。

代码如下: 编辑视图:

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

1 个答案:

答案 0 :(得分:3)

您的问题是对EditorTemplate类型使用PossibleAnswerEditorFor()方法旨在处理集合并向属性添加前缀和索引器,以便它可以在帖子后面由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>