public async Task <IActionResult> EditCodeQuestion(int testId, int questionId, [FromBody] AddCodeQuestionViewModel model) { var user = await _userManager.GetUserAsync(HttpContext.User); var test = await _context.Tests.SingleOrDefaultAsync(t => t.Id == (int)RouteData.Values["testId"]); if (test == null) { return(NotFound()); } if (test.CreatedBy != user) { return(Forbid()); } var question = await _context.CodeQuestions .Include(q => q.Code) .SingleAsync(q => q.Id == questionId); if (question.TestId != test.Id) { return(NotFound()); } model.TestId = test.Id; TryValidateModel(model); try { _context.Remove(await _context.Codes.SingleAsync(c => c.Test == test)); } catch { } if (ModelState.IsValid) { // транзакция using (var ts = _context.Database.BeginTransaction()) { var code = await _context.Codes.SingleAsync(c => c.Question == question); code.Args = model.Code.Args; code.Value = model.Code.Value; code.Output = Compile(code); var option = await _context.Options.SingleAsync(o => o.Question == question); question.Code = code; option.Text = model.Code.Output; _context.Codes.Update(code); _context.Options.Update(option); _context.Questions.Update(question); await _context.SaveChangesAsync(); ts.Commit(); } var redirectUrl = Url.Action("Details", "Test", new { id = test.Id }); return(new JsonResult(redirectUrl)); } var errors = new List <ModelError>(); foreach (var modelState in ViewData.ModelState.Values) { foreach (var error in modelState.Errors) { errors.Add(error); } } Response.StatusCode = StatusCodes.Status400BadRequest; return(new JsonResult(errors)); }
public async Task <IActionResult> AddCodeQuestion([FromBody] AddCodeQuestionViewModel model) { var user = await _userManager.GetUserAsync(HttpContext.User); var test = await _context.Tests.SingleOrDefaultAsync(t => t.Id == (int)RouteData.Values["testId"]); if (test == null) { return(NotFound()); } if (test.CreatedBy != user) { return(Forbid()); } model.TestId = test.Id; TryValidateModel(model); if (ModelState.IsValid) { using (var ts = _context.Database.BeginTransaction()) { var question = new CodeQuestion { Title = model.Title, QuestionType = Enum.GetName(typeof(Question.QuestionTypeEnum), 5), Test = test, Score = model.Score }; question = (await _context.AddAsync(question)).Entity; await _context.SaveChangesAsync(); var co = new Code { Args = model.Code.Args, Question = question, Value = model.Code.Value }; var code = (await _context.AddAsync( new Code { Args = model.Code.Args, Question = question, Value = model.Code.Value, Output = Compile(co) })).Entity; await _context.AddAsync( new Option { Text = model.Code.Output, Question = question }); question.Code = code; try { _context.Remove(await _context.Codes.SingleAsync(c => c.Test == test)); } catch { } _context.Questions.Update(question); await _context.SaveChangesAsync(); ts.Commit(); } var redirectUrl = Url.Action("Details", "Test", new { id = test.Id }); return(new JsonResult(redirectUrl)); } var errors = new List <ModelError>(); foreach (var modelState in ViewData.ModelState.Values) { foreach (var error in modelState.Errors) { errors.Add(error); } } Response.StatusCode = StatusCodes.Status400BadRequest; return(new JsonResult(errors)); }