ASP.NET MVC多个单选按钮窗体

本文关键字:单选按钮 窗体 NET MVC ASP | 更新日期: 2023-09-27 18:26:49

我正在开发一个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语法),以便向控制器提交表格,从而保存对任意数量的多项选择题的回答?

我已经花了很长时间用头撞墙了,所以非常感谢所有的帮助!非常感谢。

ASP.NET MVC多个单选按钮窗体

不确定你到底在问什么,因为你似乎已经拥有了你需要的一切,或者至少拥有了你所需要的大部分。在您的视图中,您只需在视图模型上的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>
    }
}

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