我有以下模型结构
public class Quiz
{
public List<Question> Questions { get; set; }
}
public class Question
{
public int Id { get; set; }
public String QuestionText { get; set; }
public List<Option> Options { get; set; }
public int AnswerId { get; set; }
}
public class Option
{
public int Id { get; set; }
public String OptionText { get; set; }
public int DisplayOrder { get; set; }
}
我的观点如下所示,我正在显示所有问题和选项
foreach (var question in Model.Questions)
{
@Html.DisplayFor(modelItem => question.QuestionText) <br />
foreach (var option in question.Options)
{
@Html.RadioButton("Id", option.Id)@option.OptionText
}
}
<input type="submit" value="Submit" />
我没有获得所有选定单选按钮的值,它总是在表单集合中返回一个值
[HttpPost]
public ActionResult Quiz(Quiz userResponse, FormCollection form)
{
foreach (var item in form.AllKeys)
{
string value = form[item];
// save data
}
//var selectedOption = frm["Id"];
return View();
}
你能帮忙吗?
答案 0 :(得分:1)
您创建与您的模型没有任何关系的单选按钮,并且所有单选按钮都具有相同的name="Id"
属性(并且您只能从所有问题中选择一个选项)。您需要使用for
循环或EditorTemplate
类型Question
(有关更详细的说明,请参阅this answer)。使用EditorTemplate
,您的代码将是
/Views/Shared/EditorTemplates/Question.cshtml
@model Question
@Html.HiddenFor(m => m.Id)
@Html.DisplayFor(m => m.QuestionText)
@foreach(var option in Model.Options)
{
<div>
<label>
@Html.RadioButtonFor(m => m.AnswerId , option,Id, new { id = "" })
<span>@option.OptionText</span>
</label>
</div>
}
并在主视图中
@model Quiz
@using (Html.BeginForm())
{
@Html.EditorFor(m => m.Questions)
<input type="submit" value="Save" />
}
和控制器方法
[HttpPost]
public ActionResult Quiz(Quiz model)
POST方法中的模型将与包含其Id
和AnswerId
(所选Id
)Option
属性的每个问题绑定。
旁注:您当前的POST方法有return View()
,但这会失败,因为每个Options
属性的值都是null
。如果您需要返回视图(只有在ModelState
无效时才需要),那么您需要重新填充这些集合。