在单个视图中对单选按钮进行分组,并正确地回发表单数据

时间:2013-04-22 10:29:37

标签: c# asp.net-mvc-3

我目前正在开发一个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能够自动将输入数据转换为类型化参数 - 而不是我自己。

感谢您的帮助

1 个答案:

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