public async Task <IActionResult> Update(Guid?id) { if (id == null) { return(NotFound()); } var enrolling = await _enrollingService.GetEnrollingIncludingEnrollmentAndFieldInputsAsync(id.Value); if (enrolling == null) { return(NotFound()); } var enrollment = await _enrollmentService.GetEnrollmentIncludingFieldsAndChoicesAsync(enrolling.Enrollment.Id); if (enrollment.EndTime < DateTime.Now || enrollment.Status != Models.ActivityState.Active) { return(View("AlreadyClosed", enrollment)); } var employee = await _employeeService.GetAsync(enrolling.EmployeeNo); var model = new EnrollingUpdateViewModel { Enrolling = enrolling, Enrollment = enrollment, EmployeeNo = enrolling.EmployeeNo, EmailAddress = employee.EmailAddress, Name = employee.ChineseName }; return(View(model)); }
public async Task <IActionResult> Update(Guid id, EnrollingUpdateViewModel model) { var enrolling = await _enrollingService.GetEnrollingIncludingEnrollmentAndFieldInputsAsync(id); if (enrolling == null) { return(NotFound()); } model.Enrolling = enrolling; model.Enrollment = await _enrollmentService.GetEnrollmentIncludingFieldsAndChoicesAsync(enrolling.Enrollment.Id); // check if self-enroll only var user = await _userSerivce.GetUserWithEmployeeInfoAsync(Guid.Parse(User.GetUserId())); if (model.Enrollment.SelfEnrollmentOnly && user.Employee.No != model.EmployeeNo) { return(View("SelfEnrollmentOnly", model)); } // check required fields var requiredFields = model.Enrollment.ExtraFormFields.Where(f => f.IsRequired); if (requiredFields.Any()) { foreach (var field in requiredFields) { var key = $"FieldInputs.{field.Id}"; var formField = (from item in Request.Form where item.Key == key select item).FirstOrDefault(); if (string.IsNullOrWhiteSpace(formField.Value)) { ModelState.AddModelError(string.Empty, $"{field.Name} is required."); } } } var fieldInputs = (from item in Request.Form where item.Key.StartsWith("FieldInputs.") select item).ToDictionary(item => item.Key, item => item.Value.ToString()); if (ModelState.IsValid) { await _enrollingService.UpdateAsync(enrolling.Id, model.EmployeeNo, fieldInputs, Guid.Parse(User.GetUserId()), User.GetUsername()); return(RedirectToAction("Details", new { Id = enrolling.Id })); } // bind field inputs back to the view model if (fieldInputs != null) { enrolling.FieldInputs.Clear(); foreach (var item in fieldInputs) { var fieldId = Guid.Parse(item.Key.Replace("FieldInputs.", string.Empty)); var fieldValue = item.Value ?? string.Empty; // not null enrolling.FieldInputs.Add(new FieldInput { Id = Guid.NewGuid(), FieldEntryId = fieldId, Input = fieldValue }); } } return(View(model)); }