public async Task <IActionResult> Attempt(int?id) { if (id == null) { NotFound(); } var viewModel = new ExamAttemptViewModel { Exam = await _context.Exams.Include(e => e.Questions).ThenInclude(q => q.Question).ThenInclude(q => q.Answers).FirstOrDefaultAsync(e => e.ExamId == id), ExamId = (int)id, User = await _userManager.FindByIdAsync(_userManager.GetUserId(User)), UserId = _userManager.GetUserId(User), ParticipationDate = DateTime.Now }; var questions = new List <ExamQuestionViewModel>(); foreach (ExamQuestion question in viewModel.Exam.Questions) { var questionVM = new ExamQuestionViewModel { QuestionId = question.Question.QuestionId, Text = question.Question.Text, QuestionType = question.Question.QuestionType }; var answers = new List <ExamAnswerViewModel>(); foreach (Answer answer in question.Question.Answers) { var answerVM = new ExamAnswerViewModel { Text = answer.Text, AnswerId = answer.AnswerId }; answers.Add(answerVM); } questionVM.Answers = answers; questions.Add(questionVM); } viewModel.Questions = questions; if (viewModel == null) { return(NotFound()); } return(View(viewModel)); }
public async Task <IActionResult> Attempt(ExamAttemptViewModel viewModel) { if (viewModel == null) { return(BadRequest()); } viewModel.Exam = await _context.Exams.FirstOrDefaultAsync(e => e.ExamId == viewModel.ExamId); if (viewModel.ParticipationDate.AddMinutes(viewModel.Exam.Duration) > DateTime.Now) { return(BadRequest()); } var examAttempt = new ExamAttempt { ExamId = viewModel.ExamId, UserId = viewModel.UserId, ParticipationDate = viewModel.ParticipationDate }; await _context.ExamAttempts.AddAsync(examAttempt); await _context.SaveChangesAsync(); foreach (ExamQuestionViewModel question in viewModel.Questions) { foreach (ExamAnswerViewModel answer in question.Answers) { if (answer.StudentAnswer) { var userAnswer = new UserAnswer { QuestionId = question.QuestionId, ExamAttemptId = examAttempt.ExamAttemptId, AnswerId = answer.AnswerId }; var realAnswer = await _context.Answers.FirstOrDefaultAsync(a => a.AnswerId == answer.AnswerId); userAnswer.IsValid = realAnswer.IsValid; await _context.UserAnswers.AddAsync(userAnswer); await _context.SaveChangesAsync(); } } } var userAnswers = _context.UserAnswers .Where(userAnswer => userAnswer.ExamAttemptId.Equals(examAttempt.ExamAttemptId)) .ToList(); examAttempt.Result = (userAnswers.Select(userAnswer => userAnswer.IsValid).Count() / (userAnswers.Count() != 0 ? userAnswers.Count() : 1)) * 100; var examAttemptData = _context.ExamAttempts.Update(examAttempt); if (examAttemptData == null) { return(NotFound()); } return(RedirectToAction("Index")); }