public ActionResult Update(Guid id, UpdateModel model)
{
// Validate
model.Validate(this.ModelState);
var assessment = this.assessmentsRepo.Open(id);
if (!ModelState.IsValid)
{
var editBoundaries = model.Boundaries.Select(b => new GradeBoundary(b.Grade, b.MinResult)).ToList();
var newBoundary = (model.NewBoundary == null)
? GradeBoundary.New
: new GradeBoundary(model.NewBoundary.Grade, model.NewBoundary.MinResult);
var viewModel = new EditModel(id, assessment.Name, model.TotalMarks, editBoundaries, newBoundary);
return this.View("Edit", viewModel);
}
// ReSharper disable PossibleInvalidOperationException
var boundariesToSave = model.Boundaries.Select(b => new Boundary(b.Grade, b.MinResult.Value)).ToList();
if (model.HasNewBoundary)
{
boundariesToSave.Add(new Boundary(model.NewBoundary.Grade, model.NewBoundary.MinResult.Value));
}
// ReSharper restore PossibleInvalidOperationException
// Write changes to repos.
bool hasBoundaries;
var boundaries = this.gradeBoundariesRepo.TryOpen(id, out hasBoundaries);
if (!hasBoundaries)
{
boundaries = this.gradeBoundariesRepo.Create(id);
}
if (model.TotalMarks != assessment.TotalMarks)
{
assessment.SetTotalMarks(model.TotalMarks);
}
boundaries.SetBoundaries(boundariesToSave);
return this.RedirectToAction("Edit", new { id });
}