Группа с несколькими ответами и ответы asp.net MVC

Я хочу сделать один или несколько тестов ответов с использованием radiobuttonfor и checkboxFor, но я не могу заставить его работать. Проблема со всеми примерами, которые я вижу, состоит в том, что модель "Вопрос" также регистрирует SelectedAnswer, но в моем случае я хочу, чтобы каждый возможный ответ был выбираемым, поскольку некоторые вопросы будут иметь несколько ответов, и, таким образом, свойство isSelected находится непосредственно внутри модели "Ответ".

Следовательно, для вопросов с отдельными ответами, когда я пытаюсь создать свою модель с помощью RadioButtonFor(m => m[question].Answers[answerToDisplayId].IsSelected), каждый ответ находится в своей собственной группе и не проверяется, когда я проверяю другой ответ из этого вопроса (в основном это ведет себя как checkBoxFor)

Что у меня сейчас есть: модель вопроса

public enum questionfield
{
    Chaser, Beater, Seeker, Contact, Process, Other
};
public enum QuestionDifficulty
{
    Basic, Advanced
};
public enum AnswerType
{
    SingleAnswer, MultipleAnswer
}

public class Question
{
    public int Id { get; set; }
    [Required(ErrorMessage = "Question name not valid")]
    public string Name { get; set; }
    [Required]
    public QuestionField Field { get; set; }
    [Required]
    public QuestionDifficulty Difficulty { get; set; }
    [Required]
    public bool IsVideo { get; set; }
    public string VideoURL { get; set; }
    [Required]
    public string QuestionText { get; set; }
    [Required]
    public AnswerType AnswerType { get; set; }
    [Required]
    public List<Answer> Answers { get; set; }
    [Required]
    public String AnswerExplanation { get; set; }

Модель ответа:

public class Answer
{
    public int Id { get; set; }
    public String Answertext { get; set; }
    public Boolean IsTrue { get; set; }
    public Boolean IsSelected { get; set; }
}

Вид:

<div> 
    <!-- For each Question, display a new div with the Title, the question code, the question text, the video if there is one, then the possible answers depending on the type of answers-->
    @using(Html.BeginForm("QuizzResult", "Home"))
    {
        for(int i = 0; i < Model.Count; i++)
        {
            <div class="QuizzQuestion">
                <div class="QuizzQuestionTitle">@Model[i].Id : @Model[i].Name</div> @Html.HiddenFor(m => Model[i].Id)
                <div class="QuizzQuestiontext">@Model[i].QuestionText</div>
                @if(@Model[i].IsVideo)
                {
                    <div class="QuizzQuestionVideoContainer">
                        <iframe class="QuizzQuestionVideo" id="ytplayer" type="text/html"
                                src="@Model[i].VideoURL"
                                frameborder="0"></iframe>
                    </div>
                }
                <div class="RadioButtonAnswers">
                @if (@Model[i].AnswerType == QRefTrain3.Models.AnswerType.SingleAnswer)
                {
                    for (int j = 0; j < Model[i].Answers.Count; j++)
                    {
                        @Model[i].Answers[j].Answertext @Html.RadioButtonFor(m => m[i].Answers[j].IsSelected, true)
                        @Html.HiddenFor(m => Model[i].Answers[j].IsTrue)
                    }
                }
                </div>
            </div>
        }
        <input type="submit" value="Validate Answers"/>
    }
</div>

Контроллер:

    [HttpPost]
    public ActionResult QuizzResult(List<Question> answers)
    {
        foreach(Question a in answers)
        {
            var b = Request.Form[a.Id.ToString()];

        }
        Result result = new Result();
        foreach (Question q in answers)
        {
            result.QuestionsAskedIds.Add(q.Id);
            if (Question.IsGoodAnswer(q))
            {
                result.GoodAnswersIds.Add(q.Id);
            }
        }
        if (User.Identity.IsAuthenticated)
        {
            result.User = Dal.Instance.GetUserByName(HttpContext.User.Identity.Name);

            Dal.Instance.CreateResult(result);
        }

        return View("QuizResult", result);
    }

Каков был бы хороший способ сделать это? Спасибо!

1 ответ

В случае, если кто-то увидит это:

Решение, которое я нашел, состояло в том, чтобы изменить модель: вместо того, чтобы иметь один параметр IsSelected на ответ, добавьте List selectedAnswers к вашей модели Вопросов. Затем, в представлении, добавьте свою кнопку радио следующим образом:

@Html.RadioButtonFor(m => m[i].SelectedAnswers, Model[i].Answers[j].Id)

Вы сохраните идентификатор каждого выбранного ответа на этот вопрос в списке SelectedAnswers. Затем вы можете создать свои результаты, используя эти данные.

Другие вопросы по тегам