我目前正在开发一个MVC应用程序,它在一个视图中涉及多组radiobuttons。
当回发View时,我希望自动解析和输入表单数据,以便控制器中的回发方法传递为每组radiobuttons选择的选项。
以下是一些示例代码来说明这一点:
模型
public class SurveyViewModel {
public List<SurveyQuestion> Questions { get; set; }
}
public class SurveyQuestion
{
public string Question { get; set; }
public IEnumerable<SelectListItem> Options { get; set; }
public int Answer { get; set; }
}
public class Option
{
public int Value { get; set; }
public string Text { get; set; }
}
控制器
public ActionResult Survey()
{
List<string> questions = new List<string> { "Question 1", "Question 2", "Question 3" };
SurveyViewModel model = new SurveyViewModel {
Questions = new List<SurveyQuestion>()
};
foreach (string question in questions)
{
List<Option> list = new List<Option>();
list.Add(new Option() { Value = 1, Text = "Answer 1" });
list.Add(new Option() { Value = 2, Text = "Answer 2" });
list.Add(new Option() { Value = 3, Text = "Answer 3" });
SelectList sl = new SelectList(list, "Value", "Text");
model.Questions.Add(new SurveyQuestion {
Question = question,
Answer = 1, // TODO: Get this from DB
Options = sl
});
}
return View(model);
}
查看
@foreach (SurveyQuestion question in Model.Questions)
{
<p>@question.Question</p>
@Html.RadioButtonForSelectList(m => question.Answer, question.Options)
}
辅助
http://jonlanceley.blogspot.co.uk/2011/06/mvc3-radiobuttonlist-helper.html
如果我们只是坚持使用标准MVC(没有扩展名),Html.RadioButtonFor
助手最终会输出重复按钮组,这些组重复选项[0],选项[1],选项[2]等的命名约定在客户端。
这导致每个组的第一个选项被分组,每个组的第二个选项被分组,依此类推。
另一种方法是在控制器的回发操作中检查当前请求表单数据,并手动解析,但我希望利用MVC能够自动将输入数据转换为类型化参数 - 而不是我自己。
感谢您的帮助
答案 0 :(得分:2)
不要对集合使用foreach
循环,因为模型绑定器无法编写正确的标记,以便正确绑定集合中的每个项目。您需要使用for-loop
:
for (var i = 0; i < Model.Questions.Count(); i++)
{
<p>@Model.Questions[i].Question</p>
@Html.RadioButtonForSelectList(m => Model.Questions[i].Answer, Model.Questions[i].Options)
}
您可以检查使用forloop
编写的标记。现在每个问题都已编入索引(例如Questions[0].Answer
,Questions[1].Answer
等),因此模型绑定器可以正常工作。我敢打赌,radiobuttonlist帮助器甚至不能使用你当前的代码,因为它写出了具有相同名称的选项(例如question.Answer)。因此,所有选项都被视为一个组。