ASP.NET MVC多个Radiobutton表单

时间:2015-12-15 13:09:50

标签: c# asp.net asp.net-mvc razor viewmodel

我正在开发一个ASP.NET MVC应用程序,它允许用户创建自己的调查。为了简单回答这个问题,我们可以说他们只能创建带有多项选择题的调查,每个问题都将作为问题显示给调查对象,然后是代表每个可能答案的无线电按钮列表。用户可以根据需要在调查中创建尽可能多的多项选择题。

所以,我有一个ViewModel如下:

public class SurveyViewModel
{
    public int Id { get; set; }
    public IList<Question> Questions { get; set; }
}

public class Question
{
    public int Id { get; set; }
    public string Question { get; set; }
    public IList<Answer> Answers { get; set; }
}

public class Answer
{
    public int Id { get; set; }
    public string LabelText { get; set; }
}

通常,我只需将表单中每个问题的字段添加到SurveyViewModel。但是,在这种情况下,我显然不知道存在多少问题,因为用户可以创建他们想要的许多问题 - 因此我无法创建一个字段来存储用户对每个问题的答案。

所以我的问题是:如何编写ViewModel和View(使用Razor语法)以便我可以向Controller提交表单,以便对每个任意数量的多项选择问题的响应都可以保存?

我花了很长时间在这个墙上撞到墙上,所以非常感谢所有的帮助!谢谢!

2 个答案:

答案 0 :(得分:1)

不确定您要问的是什么,因为您似乎拥有了所需的一切,或者至少是您需要的大部分内容。在您的视图中,您只需在视图模型上迭代Questions,然后针对每个问题迭代Answers。唯一要记住的是你需要使用for循环而不是foreach,这样你就可以索引列表属性,允许Razor为modelbinder生成正确的输入名称。您需要进行的一项修改是将以下属性添加到Question

public int SelectedAnswerId { get; set; }

然后,您的视图将类似于:

@for (var i = 0; i < Model.Questions.Count(); i++)
{
    <p>@Model.Questions[i].Question</p>

    @for (var j = 0; j < Model.Questions[i].Answers.Count(); j++)
    {
        @Html.RadioButtonFor(m => m.Questions[i].SelectedAnswerId, Model.Questions[i].Answers[j].Id, new { id = "Question" + i.ToString() + "Answer" + j.ToString() })
        <label for="Question@(i)Answer@(j)">@Model.Questions[i].Answers[j].LabelText</label>
    }
}

编辑:通过为每个单选按钮传递一个ID并使用该ID创建标签来更正单选按钮标签。否则,你最终会得到一堆实际上不会激活相应单选按钮的标签。

答案 1 :(得分:-1)

这看起来是我前段时间遇到的另一个问题。这可以帮助您:Structure for MVC4 Survey Web App