编辑器模板中的单选按钮
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
使用 EditorTemplate
。 EditorFor()
方法旨在与集合一起使用,并向 属性 添加前缀和索引器,以便它可以通过 post 后面的 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>
}
这将生成 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 }
的用法一样)。没有更可靠的方法来保证模型绑定会失败:)
我正在创建一个 '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
使用 EditorTemplate
。 EditorFor()
方法旨在与集合一起使用,并向 属性 添加前缀和索引器,以便它可以通过 post 后面的 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>
}
这将生成 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 }
的用法一样)。没有更可靠的方法来保证模型绑定会失败:)