在MVC中获取选定的radiobutton值

时间:2016-03-29 23:17:26

标签: c# asp.net asp.net-mvc asp.net-mvc-4 asp.net-mvc-5

我有以下模型结构

public class Quiz
{
    public List<Question> Questions { get; set; }
}

public class Question
{
    public int Id { get; set; }
    public String QuestionText { get; set; }
    public List<Option> Options { get; set; }
    public int AnswerId { get; set; }
}

public class Option
{
    public int Id { get; set; }
    public String OptionText { get; set; }
    public int DisplayOrder { get; set; }
}

我的观点如下所示,我正在显示所有问题和选项

foreach (var question in Model.Questions)
{
    @Html.DisplayFor(modelItem => question.QuestionText) <br />
    foreach (var option in question.Options)
    {
        @Html.RadioButton("Id", option.Id)@option.OptionText
    }
}
<input type="submit" value="Submit" />

我没有获得所有选定单选按钮的值,它总是在表单集合中返回一个值

[HttpPost]
public ActionResult Quiz(Quiz userResponse, FormCollection form)
{
    foreach (var item in form.AllKeys)
    {
        string value = form[item];
        // save data 
    }
    //var selectedOption = frm["Id"];
    return View();
}

你能帮忙吗?

1 个答案:

答案 0 :(得分:1)

您创建与您的模型没有任何关系的单选按钮,并且所有单选按钮都具有相同的name="Id"属性(并且您只能从所有问题中选择一个选项)。您需要使用for循环或EditorTemplate类型Question(有关更详细的说明,请参阅this answer)。使用EditorTemplate,您的代码将是

/Views/Shared/EditorTemplates/Question.cshtml

@model Question
@Html.HiddenFor(m => m.Id)
@Html.DisplayFor(m => m.QuestionText)
@foreach(var option in Model.Options)
{
    <div>
        <label>
            @Html.RadioButtonFor(m => m.AnswerId , option,Id, new { id = "" })
            <span>@option.OptionText</span>
        </label>
    </div>
}

并在主视图中

@model Quiz
@using (Html.BeginForm())
{
    @Html.EditorFor(m => m.Questions)
    <input type="submit" value="Save" />
}

和控制器方法

[HttpPost]
public ActionResult Quiz(Quiz model)

POST方法中的模型将与包含其IdAnswerId(所选IdOption属性的每个问题绑定。

旁注:您当前的POST方法有return View(),但这会失败,因为每个Options属性的值都是null。如果您需要返回视图(只有在ModelState无效时才需要),那么您需要重新填充这些集合。