When binding checkboxes in a form to a list of models is it possible to return the List<Model>
instead of merely the string[]
of IDs of the checked boxes?
Ideally I would like to receive the List<Result>
after form submission to simply update the previously created entries. Is this a feasible option?
Controller:
public IActionResult Quiz()
{
//var test = _context2.Questions.Include(test => test.MultipleChoices);;
//var allQuestions = _context2.Questions.Include(allQuestions => allQuestions.MultipleChoices).ToList();
var allQuestions = _context2.Questions.Include(allQuestions => allQuestions.Answers).ThenInclude(answers => answers.MultipleChoices).ToList();
List<Result> allResults = new List<Result>();
_context2.Results.ExecuteDelete();
foreach (Question question in allQuestions)
{
foreach (Answer answer in question.Answers)
{
if (answer.AnswerType.Equals("MultipleChoice"))
{
foreach (MultipleChoice multipleChoiceToAdd in answer.MultipleChoices)
{
_context2.Results.Add(createResultToAdd(question, answer));
allResults.Add(createResultToAdd(question, answer));
}
}
else if (answer.AnswerType.Equals("TextAnswer"))
{
_context2.Results.Add(createResultToAdd(question, answer));
allResults.Add(createResultToAdd(question, answer));
}
}
}
_context2.SaveChanges();
allResults = _context2.Results
.Include(allResults2 => allResults2.Question)
.Include(allResults2 => allResults2.Answer)
.ThenInclude(answer => answer.MultipleChoices)
.Include(allResults2 => allResults2.Answer)
.ThenInclude(answer => answer.TextAnswers).ToList();
return View(allResults);
}
private Result createResultToAdd(Question question, Answer answerTemplate)
{
Result resultToAdd = new Result();
resultToAdd.QuestionId = question.QuestionId;
resultToAdd.AnswerId = answerTemplate.AnswerId;
resultToAdd.CheckedResult = true;
return resultToAdd;
}
[HttpPost]
public IActionResult StoreResult(string[] result) //List<Result> results
{
System.Diagnostics.Debug.WriteLine(result);
return RedirectToAction("Index");
}
View:
@{
ViewData["Title"] = "Quiz";
}
@model List<Result>
<div class="text-center">
<h1 class="display-4">Quiz</h1>
<form asp-controller="Home" asp-action="StoreResult" method="post">
@{
foreach (var QuestionID in Model.OrderBy(m => m.QuestionId).GroupBy(m => m.QuestionId))
{
var question = @Model.Where(m => m.QuestionId == QuestionID.Key).Select(m => m.Question).First();
<div class="container-fluid" style="background: #d7f6c8 ;">
@{
<h2>@question.QuestionText</h2>
if (question.ImageAttachment != null)
{
<img [email protected] style="width:5em;" alt="Sample Photo" />
}
var checkBoxIndices = @Model.Where(m => m.QuestionId == QuestionID.Key).Select(m => Model.IndexOf(m)).ToList();
var result2 = Model.Where(m => m.QuestionId == QuestionID.Key).ToList();
<table class="table">
<tbody>
@{
if (question.QuestionType.Equals("MultipleChoice"))
{
//foreach (var answer in Model.Where(m => m.QuestionId == QuestionID.Key).ToList())
foreach (int modelAnswerIndex in checkBoxIndices)
{
if (Model[modelAnswerIndex].Answer.AnswerType.Equals("MultipleChoice"))
{
var mcqAnswer = Model[modelAnswerIndex].Answer.MultipleChoices.FirstOrDefault();
if (Model[modelAnswerIndex].Question.SingleSelect)
{
<td>
@if (Model[modelAnswerIndex].Answer.MultipleChoices.First().ImageAttachment == null)
{
@Model[modelAnswerIndex].Answer.AnswerText @*Option Text *@
}
else
{
@Model[modelAnswerIndex].Answer.AnswerText @*Option Text *@
<img [email protected] style="width:5em;" alt="Sample Photo" />
}
<input class="form-check-input" type="radio" name="Result" value="@Model[modelAnswerIndex].ResultId" checked="@Model[modelAnswerIndex].CheckedResult"> @*Radio Button *@
</td>
}
else
{
<td>
@if (mcqAnswer.ImageAttachment == null)
{
@Model[modelAnswerIndex].Answer.AnswerText @*Option Text *@
}
else
{
@Model[modelAnswerIndex].Answer.AnswerText @*Option Text *@
<img [email protected] style="width:5em;" alt="Sample Photo" />
}
<input class="form-check-input" type="checkbox" name="Result" value="@Model[modelAnswerIndex].ResultId" checked="@Model[modelAnswerIndex].CheckedResult">
</td>
}
// }
}
}
}
}
</tbody>
</table>
}
</div>
}
}
<button class="btn btn-primary mt-4" type="submit">Abgabe</button>
</form>
</div>
3