【问题标题】:ASP.NET MVC Only One of the RadioButton Input is Passed to ControllerASP.NET MVC 只有一个 RadioButton 输入被传递给控制器
【发布时间】:2017-12-15 15:16:57
【问题描述】:

我是 NET MVC 的新手,我尝试开发一个用户会回答几个问题的应用程序,

我有以下与我的问题相关的模型

  • 问题
  • 选择(包括问题 ID 作为 FK)

和一个ViewModel

public class QuestionChoiceViewModel
{
    public Question Question { get; set; }
    public IEnumerable<Choice> Choices { get; set; }
}

在我的视图中,我想将所有问题及其响应选项显示为单选按钮,因此我的视图选项/索引中有以下几行。

@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 个问题,但我在控制器中通过的是第一个问题中选择的任何内容。我做错了什么?

另外,欢迎任何关于我的风格的提示,谢谢!

【问题讨论】:

  • 您不能为您的模型使用foreach 循环。参考this answer
  • Stephen 是正确的,您的收音机的“名称”值需要与模型内部的属性名称相匹配。现在,您可以选择填充“名称”属性的文本。
  • @StephenMuecke 感谢您的宝贵时间,您的回答对我很有用。但是当我将我的名称属性更改为问题 ID 时,我可以为单选按钮生成我想要的名称。因为无论如何我都想用问题 ID 对它们进行分组。它现在有效,我希望我不会错过其他东西。
  • 如果您声称它有效,那么您显然没有测试过它。您的代码存在多个错误和可怕的做法。也许this answer 可能有助于为您指明正确的方向。

标签: c# asp.net-mvc radio-button formcollection


【解决方案1】:

乍一看,有两点不合时宜:

  • 内部表单标签&lt;form class="form-group"&gt;不需要是表单,嵌套表单会导致问题。
  • 单选输入的名称属性用于将它们组合在一起,因此对于一个问题的选择应该相同,例如它应该是 @q.something 而不是 @c.choiceText

另外,名称应该是一些简短的标识符,而不是针对用户的文本,因为我猜 c.choiceText 是:

ID 和 NAME 标记必须以字母 ([A-Za-z]) 开头,并且可以是 后跟任意数量的字母、数字 ([0-9])、连字符 ("-")、 下划线 ("_")、冒号 (":") 和句点 (".")。 https://www.w3.org/TR/html401/types.html#type-name

【讨论】:

  • 这对我有帮助。问题在于你提出的第二点。我用问题的 ID 更改了名称属性,因此它们完全按照我想要的方式分组。谢谢你的时间:)
猜你喜欢
  • 1970-01-01
  • 2016-04-25
  • 2010-09-14
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-31
相关资源
最近更新 更多