public async Task <ActionResult> ScoreExercise(int id, string nextUrl, string exerciseScore, bool?prohibitFurtherReview, string errorUrl = "", bool recheck = false) { if (string.IsNullOrEmpty(errorUrl)) { errorUrl = nextUrl; } using (var transaction = db.Database.BeginTransaction()) { var checking = slideCheckingsRepo.FindManualCheckingById <ManualExerciseChecking>(id); if (checking.IsChecked && !recheck) { return(Redirect(errorUrl + "Эта работа уже была проверена")); } if (!checking.IsLockedBy(User.Identity)) { return(Redirect(errorUrl + "Эта работа проверяется другим инструктором")); } var course = courseManager.GetCourse(checking.CourseId); var slide = (ExerciseSlide)course.GetSlideById(checking.SlideId); var exercise = slide.Exercise; int score; /* Invalid form: score isn't integer */ if (!int.TryParse(exerciseScore, out score)) { return(Redirect(errorUrl + "Неверное количество баллов")); } /* Invalid form: score isn't from range 0..MAX_SCORE */ if (score < 0 || score > exercise.MaxReviewScore) { return(Redirect(errorUrl + $"Неверное количество баллов: {score}")); } checking.ProhibitFurtherManualCheckings = false; await slideCheckingsRepo.MarkManualCheckingAsChecked(checking, score); if (prohibitFurtherReview.HasValue && prohibitFurtherReview.Value) { await slideCheckingsRepo.ProhibitFurtherExerciseManualChecking(checking); } await visitsRepo.UpdateScoreForVisit(checking.CourseId, checking.SlideId, checking.UserId); transaction.Commit(); } return(Redirect(nextUrl)); }