Ejemplo n.º 1
0
        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));
        }
Ejemplo n.º 2
0
        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));
        }