Asp.net mvc 编辑器模板中的单选按钮

Asp.net mvc 编辑器模板中的单选按钮,asp.net-mvc,radio-button,survey,mvc-editor-templates,Asp.net Mvc,Radio Button,Survey,Mvc Editor Templates,我正在创建一份“进度报告”,其中包含一系列问题和多项选择答案。如果问题与进度报告相关,则通过单独的无关流程自动将其填入进度报告中 代码如下: 编辑视图: @model App.Models.ProgressReport @Html.EditorFor(model => model.ReportAnswers) ReportAnswer.cshtml EditorTemplate(显示进度报告中的问题和答案): 您的问题是使用编辑器或模板进行可能的类型应答。EditorFor()方法设计用

我正在创建一份“进度报告”,其中包含一系列问题和多项选择答案。如果问题与进度报告相关,则通过单独的无关流程自动将其填入进度报告中

代码如下: 编辑视图:

@model App.Models.ProgressReport
@Html.EditorFor(model => model.ReportAnswers)
ReportAnswer.cshtml EditorTemplate(显示进度报告中的问题和答案):


您的问题是使用
编辑器或模板
进行
可能的类型应答
EditorFor()
方法设计用于处理集合,并向相同的属性添加前缀和索引器,以便通过回发时的
DefaultModelBinder
将其绑定到集合。第二个问题是将单选按钮绑定到
PossibleAnswer
的属性
AnswerText
,此时您应该绑定到
ReportAnswer
AnswerID
属性

删除
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>
}
@model App.Models.ReportAnswer
问题:
@DisplayFor(x=>x.Question.QuestionText)

@foreach(模型中的var答案。问题。可能答案) { var id=string.Format(“answer-{0}”,answer.AnswerID); @RadioButton(m=>m.AnswerID,AnswerID,new{id=id}) @答案

}
这将生成如下所示的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>

答复1
答复2

旁注:永远不要尝试覆盖
名称
属性(就像在您使用
新{name=Model.QuestionID}
时一样。没有更可靠的方法保证模型绑定会失败:)

现在可以完美地工作了!除了在发布进度报告时实际发布答案。我已将我的控制器代码添加到原始帖子中。忘了。不知道你发布答案是什么意思?您不(也不应该)呈现
可能的应答器
的所有属性的控件。您应该只为每个问题发布所选的
AnswerID
。如果您需要返回视图(只有在
ModelState
无效时才应该返回),那么您需要重新填充每个问题的答案集合。并删除可怕的
[Bind(Include=“”)]
属性!如果您有要从绑定中排除的属性,请使用仅包含需要显示/编辑的属性的视图模型(然后您还可以包括
选择列表
的属性,并删除
视图包
),很抱歉绑定(包括..)自动操作,我不知道我不应该使用它。:)当我用所选答案发布编辑时,我希望将这些所选答案记录回数据库。所以是的,只是回答,当然还有PK ID。我不知道怎么做?也许我遗漏了一些明显的东西?我假设PK ID是指questions ID属性,但您似乎没有在视图中包含该属性的隐藏输入(因此不会发回)。我对您的模型和数据库了解不够,但您可以使用类似于
foreach(progressReport.ReportAnswers中的ReportAnswer-answer){int-questionID=answer.questionID;int-answerID=answer.answerID;//将值保存到数据库?}
[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);
    }
@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>
}
<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>