asp.net核心的复选框和单选按钮问题

本文关键字:单选按钮 问题 复选框 net 核心 asp | 更新日期: 2023-09-27 18:18:22

我正在尝试为我的工作开发一个在线考试工具。我有一个类,它定义了一个包含问题列表的考试,一个包含答案列表的Question类,以及一个包含答案列表的Answer类。我有一个视图模型,它取出问题列表并将其传递给视图,还有一个整数数组,用于保存每个问题的答案值。在视图中,我循环遍历问题,在每个问题中循环遍历每个可能的答案。对于选择题来说,这很简单。我只使用:

<input asp-for="SelectedAnswer[q]" type="radio" value="@a" />@Model.Questions[q].answers[a].AnswerText

这个工作得很好,它将SelectedAnswer int数组传递给提交时的控制器,我可以对它做任何我想做的事情。我的问题归结为问题是否需要一个复选框来选择多个正确答案。我显然不能使用相同的int数组来发回的答案,所以我想创建一个问题中的每个复选框的第二个bool数组,并发回。但这实际上只适用于一个问题,因为每个新问题都会在回发时覆盖bool数组。

我想弄清楚的是如何做到这一点,我有不同类型的问题,可以显示在一个页面上,并发送回控制器时,提交按钮按下处理。

也许我需要一个更好的视图模型?我不知道下一步该怎么做。我可以提供所需的任何代码,我只是不想用代码填满整个页面。

我的观点:

@model DSCA_Exams.Models.ExamViewModels.ExamViewModel
<form asp-action="Exam_Results">
    <div>
        @for (int q = 0; q < Model.Questions.Count(); q++)
        {
            <div>
                <hr />
                <h4>@Model.Questions[q].QuestionText</h4>
                <ul>
                    @for (int a = 0; a < Model.Questions[q].answers.Count(); a++)
                    {
                        <li>
                            @if (Model.Questions[q].QuestionType == 0)
                            {
                                <input asp-for="SelectedAnswer[q]" type="radio" value="@a" />@Model.Questions[q].answers[a].AnswerText
                            }
                            else
                            {
                                <input asp-for="@Model.isSelected[a]"  />@Model.Questions[q].answers[a].AnswerText
                            }
                        </li>
                    }
                </ul>
            </div>
        }
        <hr />
        <input type="submit" value="Grade Test" class="btn btn-default" />
    </div>
</form>

asp.net核心的复选框和单选按钮问题

使用视图模型并保留对象图。例如:

public class QuestionViewModel
{
    public string QuestionText { get; set; }
    public List<AnswerViewModel> Answers { get; set; }
    public List<int> SelectedAnswers { get; set; }
    ...
}

那么,在你看来:

@for (var i = 0; i < Model.Questions.Count; i++)
{
    <p>@Model.Questions[i].QuestionText</p>
    @for (var j = 0; j < Model.Questions[i].Answers.Count; j++)
    {
        <label>
            <input asp-for="Questions[i].SelectedAnswers" type="radio" value="@Model.Questions[i].Answers[j].Id" />
            @Model.Questions[i].Answers[j].AnswerText
        </label>
    }
}

然后,当您发布时,模型绑定器将能够保存对象图,并且您可以检查每个问题的SelectAnswers属性。