public ActionResult Update(Guid id, UpdateModel model) { var assessment = this.assessmentsRepo.Open(id); model.Validate(this.ModelState); if (!ModelState.IsValid) { bool hasBoundaries; var boundaries = this.gradeBoundariesRepo.TryOpen(id, out hasBoundaries); var viewModel = hasBoundaries ? new EditModel(id, model, boundaries) : new EditModel(id, model); return this.View("Edit", viewModel); } if (model.Name != assessment.Name) { assessment.SetName(model.Name); this.assessmentIndex.Set(id, model.Name); } // Check for total marks update. if (model.TotalMarks != assessment.TotalMarks) { assessment.SetTotalMarks(model.TotalMarks); } // Check for updates int? lastSelectedResult = null; if (model.Results != null) { foreach (var modelResult in model.Results) { var assessmentResult = assessment.Results.Single(r => r.Id == modelResult.RowId); if (modelResult.Forenames != assessmentResult.Forenames || modelResult.Surname != assessmentResult.Surname) { assessment.SetCandidateNames(assessmentResult.Id, modelResult.Surname, modelResult.Forenames); } if (modelResult.Result != assessmentResult.Result) { lastSelectedResult = model.Results.IndexOf(modelResult); assessment.SetCandidateResult(assessmentResult.Id, modelResult.Result); } } } // Check for new row if (!string.IsNullOrWhiteSpace(model.NewRow.Surname) && !string.IsNullOrWhiteSpace(model.NewRow.Forenames)) { var newCandidateId = assessment.AddCandidate(model.NewRow.Surname, model.NewRow.Forenames); if (model.NewRow.Result.HasValue) { assessment.SetCandidateResult(newCandidateId, model.NewRow.Result.Value); } } return this.RedirectToAction("Edit", new { id, lastSelectedResult }); }