ASP.NET MVC 只有一个 RadioButton 输入被传递给控制器
ASP.NET MVC Only One of the RadioButton Input is Passed to Controller
我是 NET MVC 的新手,我尝试开发一个用户会回答几个问题的应用程序,
我有以下 模型 与我的问题相关:
- 问题
- 选择(包括问题 ID 作为 FK)
和一个 ViewModel
public class QuestionChoiceViewModel
{
public Question Question { get; set; }
public IEnumerable<Choice> Choices { get; set; }
}
在我的 视图中 我想将所有问题及其响应选项显示为单选按钮,因此我的视图中有以下几行 Choice/Index.
@model IEnumerable<WebApplication.Models.QuestionChoiceViewModel>
@using (Html.BeginForm("Index", "Choices", FormMethod.Post))
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
@foreach (var q in Model){
@:<b>Question:</b>
@Html.DisplayFor(modelItem => q.Question.questionText)
<form class="form-group">
@foreach(var c in q.Choices){
<input type="radio" name="@c.choiceText" value="@c.choiceID" />
@c.choiceText
<br />
}
</form>
<br />
}
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="button" value="Back" class="btn btn-default" id="btnBack" />
<input type="submit" name="btnSubmit" value="Submit" class="btn btn-default" />
</div>
</div>
</div>
}
我可以毫无问题地显示并从多个问题中进行选择。
对于最后的代码示例,请参阅我的 controller 仅采用 FormCollection 类型作为参数
public ActionResult Index(FormCollection form)
问题: 当我调试并查看表单中的内容时 - 除了 Token 等 - 只是第一个单选按钮组的值。假设我有 10 个问题,但我在控制器中传递的是第一个问题中选择的任何内容。我做错了什么?
此外,欢迎任何关于我的风格的提示,谢谢!
乍一看,有两点似乎不合时宜:
- 内部表单标签
<form class="form-group">
不需要表单,嵌套表单会出问题
- 无线电输入的名称 属性 用于将它们组合在一起,因此对于一个问题的选择应该相同,例如它应该是 @q.something 而不是 @c.choiceText
此外,名称应该是一些简短的标识符,而不是针对用户的文本,因为我认为 c.choiceText 是:
ID and NAME tokens must begin with a letter ([A-Za-z]) and may be
followed by any number of letters, digits ([0-9]), hyphens ("-"),
underscores ("_"), colons (":"), and periods (".").
https://www.w3.org/TR/html401/types.html#type-name
我是 NET MVC 的新手,我尝试开发一个用户会回答几个问题的应用程序,
我有以下 模型 与我的问题相关:
- 问题
- 选择(包括问题 ID 作为 FK)
和一个 ViewModel
public class QuestionChoiceViewModel
{
public Question Question { get; set; }
public IEnumerable<Choice> Choices { get; set; }
}
在我的 视图中 我想将所有问题及其响应选项显示为单选按钮,因此我的视图中有以下几行 Choice/Index.
@model IEnumerable<WebApplication.Models.QuestionChoiceViewModel>
@using (Html.BeginForm("Index", "Choices", FormMethod.Post))
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
@foreach (var q in Model){
@:<b>Question:</b>
@Html.DisplayFor(modelItem => q.Question.questionText)
<form class="form-group">
@foreach(var c in q.Choices){
<input type="radio" name="@c.choiceText" value="@c.choiceID" />
@c.choiceText
<br />
}
</form>
<br />
}
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="button" value="Back" class="btn btn-default" id="btnBack" />
<input type="submit" name="btnSubmit" value="Submit" class="btn btn-default" />
</div>
</div>
</div>
}
我可以毫无问题地显示并从多个问题中进行选择。
对于最后的代码示例,请参阅我的 controller 仅采用 FormCollection 类型作为参数
public ActionResult Index(FormCollection form)
问题: 当我调试并查看表单中的内容时 - 除了 Token 等 - 只是第一个单选按钮组的值。假设我有 10 个问题,但我在控制器中传递的是第一个问题中选择的任何内容。我做错了什么?
此外,欢迎任何关于我的风格的提示,谢谢!
乍一看,有两点似乎不合时宜:
- 内部表单标签
<form class="form-group">
不需要表单,嵌套表单会出问题 - 无线电输入的名称 属性 用于将它们组合在一起,因此对于一个问题的选择应该相同,例如它应该是 @q.something 而不是 @c.choiceText
此外,名称应该是一些简短的标识符,而不是针对用户的文本,因为我认为 c.choiceText 是:
ID and NAME tokens must begin with a letter ([A-Za-z]) and may be followed by any number of letters, digits ([0-9]), hyphens ("-"), underscores ("_"), colons (":"), and periods ("."). https://www.w3.org/TR/html401/types.html#type-name