@if (!ViewData.ModelState.IsValid)
{
<div class="validation-summary-errors">
@foreach (var state in ViewData.ModelState)
{
foreach (var error in state.Value.Errors)
{
<p>@state.Key :: @error.ErrorMessage</p>
}
}
</div>
}
In this part of view, it displayed
The Quiz field is required.
:: The QuestionMark field is required.
:: The Question field is required.
:: The value '' is invalid.
:: The Question field is required.
Question.Quiz :: The Quiz field is required.
Question.QuestionMark :: The QuestionMark field is required.
Answer[0].Question :: The Question field is required.
Answer[1].Marks :: The value '' is invalid.
Answer[1].Question :: The Question field is required.
Controller:
using Microsoft.AspNetCore.Mvc;
namespace project.Controllers;
using System;
using System.Collections.Generic;
using project.Model;
public class QuizController : Controller
{
public IActionResult Main()
{
return View();
}
public IActionResult Management()
{
return View();
}
public IActionResult ListQuiz()
{
List<project.Model.Quiz> quizzes = DBUtl.GetList<project.Model.Quiz>("SELECT * FROM Quiz");
return View(quizzes);
}
public IActionResult AddQuiz()
{
var model = new QuizViewModel
{
Quiz = new Quiz(),
Question = new Question(),
Answer = new List<Answer> { new Answer(), new Answer() }
};
return View(model);
}
[HttpPost]
public IActionResult AddQuiz(QuizViewModel model)
{
if (!ModelState.IsValid)
{
foreach (var state in ModelState.Values)
{
foreach (var error in state.Errors)
{
ModelState.AddModelError(string.Empty, error.ErrorMessage);
}
}
TempData["Message"] = "Please correct the errors.";
TempData["MsgType"] = "danger";
return View(model);
}
else
{
string insertQuiz = @"INSERT INTO Quiz(QuizCategory) OUTPUT INSERTED.QuizId VALUES('{0}')";
DataTable dtQuiz = DBUtl.GetTable(insertQuiz, model.Quiz.QuizCategory);
if (dtQuiz.Rows.Count == 1)
{
string insertQuestion = @"INSERT INTO Question(Quiz_Id, QuestionText, QuestionMarks, QuestionType) OUTPUT INSERTED.QuestionId VALUES('{0}', '{1}', '{2}', '{3}')";
DataTable dtQuestion = DBUtl.GetTable(insertQuestion, model.Quiz.QuizId, model.Question.QuestionText, model.Question.QuestionMark, model.Question.QuestionType);
if (dtQuestion.Rows.Count == 1)
{
foreach (var answer in model.Answer)
{
string insertAnswer = @"INSERT INTO Answer(QuestionId, AnswerText, IsCorrect, AnswerMarks) VALUES({0}, '{1}', {2}, {3})";
int resultAnswer = DBUtl.ExecSQL(insertAnswer, model.Question.QuestionId, answer.AnswerText, answer.IsCorrect ? 1 : 0, answer.Marks);
if (resultAnswer <= 1)
{
throw new Exception("Failed to insert one or more answers.");
}
}
TempData["Message"] = "Quiz created successfully!";
TempData["MsgType"] = "success";
}
}
}
return RedirectToAction("ListQuiz");
}
public IActionResult ManageQuestions(int quizId)
{
List<Question> questions = DBUtl.GetList<Question>("SELECT * FROM Question WHERE QuizId = {0}", quizId);
ViewData["QuizId"] = quizId;
return View(questions);
}
public IActionResult ManageQuestions(int quizId)
{
List<Question> questions = DBUtl.GetList<Question>("SELECT * FROM Question WHERE QuizId = {0}", quizId);
ViewData["QuizId"] = quizId;
return View(questions);
}
}
View:
@model project.Model.QuizViewModel
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link href="~/css/AddQuiz.css" rel="stylesheet" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Create Quiz</title>
</head>
<body>
@await Html.PartialAsync("navbar")
<form id="quiz-form" asp-controller="Quiz" asp-action="AddQuiz" method="post">
<label asp-for="Quiz.QuizCategory">Category:</label>
<select asp-for="Quiz.QuizCategory" id="QuizCategory" name="Quiz.QuizCategory" required>
<option value="">Select a category</option>
<option value="Lung">Lung</option>
<option value="Kidney">Kidney</option>
</select>
<label asp-for="Question.QuestionText">Question:</label>
<input asp-for="Question.QuestionText" type="text" id="QuestionText" name="Question.QuestionText" required>
<label asp-for="Question.QuestionType">QuestionType:</label>
<select asp-for="Question.QuestionType" id="QuestionType" name="Question.QuestionType" required>
<option value="">Select a question type</option>
<option value="Multiple Choice">Multiple Choice Question</option>
<option value="Multiple Choice for Text">Multiple Choice Question for Text</option>
</select>
<label for="Answers">Number of Answers:</label>
<select id="Answers" name="Answers" onchange="updateAnswers()">
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
</select>
<div id="answers-container">
</div>
<label for="QuestionImage">Upload Image (Optional):</label>
<input type="file" id="QuestionImage" name="QuestionImage" accept="image/*">
<div id="total-marks-container">
<strong>Total Marks: </strong><span id="question-marks">0</span>
</div>
<button type="submit">Submit</button>
</form>
@if (!ViewData.ModelState.IsValid)
{
<div class="validation-summary-errors">
@foreach (var state in ViewData.ModelState)
{
foreach (var error in state.Value.Errors)
{
<p>@error.ErrorMessage</p>
}
}
</div>
}
<script>
document.addEventListener('DOMContentLoaded', function () {
const numAnswersSelect = document.getElementById('Answers');
const answersContainer = document.getElementById('answers-container');
const totalMarksDisplay = document.getElementById('question-marks');
function getMaxCorrectAnswers(count) {
return count - 1;
}
function validateCorrectAnswers(maxCorrect) {
const correctCheckboxes = answersContainer.querySelectorAll('input[type="checkbox"]');
let selectedCorrect = 0;
correctCheckboxes.forEach(checkbox => {
checkbox.addEventListener('change', function () {
selectedCorrect = Array.from(correctCheckboxes).filter(cb => cb.checked).length;
if (selectedCorrect > maxCorrect) {
alert(`You can only select up to ${maxCorrect} correct answer(s).`);
this.checked = false;
hideMarksInput(this);
} else {
updateMarksVisibility(this);
}
});
});
}
function hideMarksInput(checkbox) {
const marksLabel = checkbox.closest('div').querySelector('.marks-label');
const marksInput = checkbox.closest('div').querySelector('.marks-input');
if (marksLabel && marksInput) {
marksLabel.style.display = 'none';
marksInput.style.display = 'none';
}
}
function updateMarksVisibility(checkbox) {
const marksLabel = checkbox.closest('div').querySelector('.marks-label');
const marksInput = checkbox.closest('div').querySelector('.marks-input');
if (checkbox.checked) {
marksLabel.style.display = 'inline';
marksInput.style.display = 'inline';
} else {
hideMarksInput(checkbox);
}
}
function generateAnswerFields(count) {
answersContainer.innerHTML = '';
let totalMarks = 0;
const maxCorrect = getMaxCorrectAnswers(count);
for (let i = 0; i < count; i++) {
const answerDiv = document.createElement('div');
answerDiv.classList.add('answer');
answerDiv.innerHTML = `
<label asp-for="Answer_${i}_AnswerText">Answer:</label>
<input type="text" id="Answer_${i}_AnswerText" asp-for="Answer_${i}_AnswerText" name="Answer[${i}].AnswerText" required>
<label asp-for="Answer_${i}_IsCorrect">
<input type="checkbox" id="Answer_${i}_IsCorrect" asp-for="Answer_${i}_IsCorrect" name="Answer[${i}].IsCorrect" value="true">
Correct Answer
</label>
<label asp-for="Answer_${i}_Marks" class="marks-label">Marks:</label>
<input type="number" id="Answer_${i}_Marks" asp-for="Answer_${i}_Marks" name="Answer[${i}].Marks" min="0" step="0.5" class="marks-input">
`;
answersContainer.appendChild(answerDiv);
const checkbox = answerDiv.querySelector(`#Answer_${i}_IsCorrect`);
const marksLabel = answerDiv.querySelector('.marks-label');
const marksInput = answerDiv.querySelector('.marks-input');
updateMarksVisibility(checkbox);
marksInput.addEventListener('input', function () {
const marksValue = parseFloat(marksInput.value) || 0;
totalMarks = Array.from(answersContainer.querySelectorAll('.marks-input'))
.map(input => parseFloat(input.value) || 0)
.reduce((sum, value) => sum + value, 0);
totalMarksDisplay.textContent = totalMarks.toFixed(1);
});
}
validateCorrectAnswers(maxCorrect);
}
const initialNumAnswers = parseInt(numAnswersSelect.value);
generateAnswerFields(initialNumAnswers);
numAnswersSelect.addEventListener('change', function () {
generateAnswerFields(parseInt(this.value));
});
});
</script>
</body>
</html>
I have been trying to get my stuff into the database but it doesn’t do it. It directs me to the List page.
Exception thrown: ‘System.InvalidOperationException’ in System.Data.SqlClient.dll
Exception thrown: ‘System.Security.Cryptography.CryptographicException’ in Microsoft.AspNetCore.DataProtection.dll
These appeared too when I clicked submit.
Something thing is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.