3

我目前正在开发一个 MVC 应用程序,该应用程序在单个视图中涉及多组单选按钮。

当视图被回发时,我希望表单数据被自动解析和键入,以便控制器中的回发方法传递为每组单选按钮选择的选项。

下面是一些示例代码来说明这一点:

模型

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帮助程序最终会输出在客户端中重复 Option[0]、Option[1]、Option[2] 等命名约定的单选按钮组。

这导致每个组的第一个选项被分组,每个组的第二个选项被分组,依此类推。

另一种方法是在控制器的回发动作中检查当前请求表单数据,并手动解析它,但我希望利用 MVC 将传入数据自动转换为类型参数的能力 - 而不是自己做。

谢谢您的帮助

4

1 回答 1

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].AnswerQuestions[1].Answer等等),因此模型绑定器可以正常工作。我敢打赌,radiobuttonlist 助手甚至无法使用您当前的代码,因为它会写出具有相同名称的选项(例如 question.Answer)。因此,所有选项都被视为一组。

于 2013-04-22T10:44:07.947 回答