ASP.NET MVC 多单选按钮表单
ASP.NET MVC Multiple Radiobutton Forms
我正在开发一个 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,以便对任意数量的多项选择题中的每一个做出回答可以保存吗?
我花了很长时间在这个问题上用头撞墙,所以非常感谢大家的帮助!谢谢!
不确定您要问的是什么,因为您似乎拥有您需要的一切,或者至少是您需要的大部分。在您看来,您只需在视图模型上迭代 Questions
,然后对于每个问题,迭代 Answers
。唯一要记住的是,您需要使用 for
循环而不是 foreach
,这样您就可以索引列表属性,从而使 Razor 能够为模型绑定器生成正确的输入名称。您需要做的一个修改是将 属性 添加到 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 创建一个标签来更正单选按钮标签。否则,您最终会得到一堆实际上不会激活相应单选按钮的标签。
我正在开发一个 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,以便对任意数量的多项选择题中的每一个做出回答可以保存吗?
我花了很长时间在这个问题上用头撞墙,所以非常感谢大家的帮助!谢谢!
不确定您要问的是什么,因为您似乎拥有您需要的一切,或者至少是您需要的大部分。在您看来,您只需在视图模型上迭代 Questions
,然后对于每个问题,迭代 Answers
。唯一要记住的是,您需要使用 for
循环而不是 foreach
,这样您就可以索引列表属性,从而使 Razor 能够为模型绑定器生成正确的输入名称。您需要做的一个修改是将 属性 添加到 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 创建一个标签来更正单选按钮标签。否则,您最终会得到一堆实际上不会激活相应单选按钮的标签。