【问题标题】:Checkbox and Radio button problems with asp.net coreasp.net core 的复选框和单选按钮问题
【发布时间】:2016-11-18 03:16:51
【问题描述】:

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

<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>

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-core


    【解决方案1】:

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

    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 属性。

    【讨论】:

    • 我在问题中添加了我当前的观点。我或多或少地按照你的建议做。我没有单选按钮的问题,但更多的是 chckboxlist 的问题。我不能做一个多维数组来保存每个问题的 n 个答案,所以我不知道如何将多个复选框列表的值传递回控制器。
    • 这就是我要说的。而不是试图将所有问题的所有答案压缩到一个数组中。相反,让每个问题都有自己的选定答案数组。在多选的情况下,只有一个项目,但在复选框列表的情况下,您将有多个项目。不需要多维数组。
    • 哦,我不知道你能做到。那就是我与asp.net 斗争的地方。我可以编写 c# 代码好几天,但所有这些使用 asp.net 的自动化东西对我来说都很难。我会试一试。
    • 好的,我照你说的做了,但我在同一部分遇到了不同的问题。如果我将 selectedanswers 列表设置为 int 列表,则单选按钮问题效果很好,但复选框问题会引发错误,说明它们必须是布尔值。如果我做布尔值,那么单选按钮问题不能正常工作,但复选框问题可以。我应该只做 2 个带有问题类型标志的列表,并让它为正确的问题填充正确的列表吗?或者有更清洁的方法吗?
    • 效果不错!我最终做的是创建一个名为 SelectedAnswer 的 in 和一个名为 SelectedAnswers 的布尔值列表。如果它的问题类型为 0(单选),那么它会将单选按钮结果存储在 int 中。如果它的类型为 1(复选框),那么它将每个复选框结果存储在布尔列表中。然后在我的控制器中,我只需抓取 vm,检查问题类型标志,然后根据类型标志指向的 int 或布尔列表将结果与我的考试模型进行比较,然后就可以了,一切都很好。谢谢大哥指导!
    猜你喜欢
    • 1970-01-01
    • 2013-11-18
    • 2019-11-13
    • 2020-12-10
    • 2011-09-09
    • 1970-01-01
    • 2011-10-18
    • 2016-03-03
    • 2023-04-06
    相关资源
    最近更新 更多