/// <summary> /// Handles the specified request. /// </summary> /// <param name="request">The request.</param> /// <param name="response">The response.</param> protected override void Handle(SaveSectionDtoRequest request, SaveDtoResponse <IKeyedDataTransferObject> response) { var dto = request.DataTransferObject; var assessment = _assessmentRepository.GetByKey(dto.Key); var dtoType = dto.GetType(); var entityPropertyInfo = assessment.GetType().GetProperty(request.Section); var entity = entityPropertyInfo.GetValue(assessment) as RevisionBase; if (entity == null && request.Section == "ReviewSection") { entity = Activator.CreateInstance <ReviewSection>(); entityPropertyInfo.SetValue(assessment, entity); } if (request.SubSection != null) { entityPropertyInfo = entityPropertyInfo.PropertyType.GetProperty(request.SubSection); entity = entityPropertyInfo.GetValue(entity) as RevisionBase; } var entityType = entityPropertyInfo.PropertyType; foreach (var propertyInfo in dtoType.GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public).Where(pi => { var readonlyAttribute = pi.GetCustomAttributes(typeof(ReadOnlyAttribute), false).FirstOrDefault() as ReadOnlyAttribute; return(readonlyAttribute == null || !readonlyAttribute.IsReadOnly); })) { var valueToSet = propertyInfo.GetValue(dto); var lookupDto = valueToSet as LookupDto; if (lookupDto != null) { var entityProperty = entityType.GetProperty(propertyInfo.Name); valueToSet = Lookup.Find(entityProperty.PropertyType.Name, lookupDto.Code); } var enumerableLookups = valueToSet as IEnumerable <LookupDto>; if (enumerableLookups != null) { var entityProperty = entityType.GetProperty(propertyInfo.Name); var lookupType = entityProperty.PropertyType.GetGenericArguments()[0]; var newValues = Activator.CreateInstance(typeof(List <>).MakeGenericType(entityProperty.PropertyType.GetGenericArguments()[0])) as IList; foreach (var lookup in (valueToSet as IEnumerable <LookupDto>)) { newValues.Add(Lookup.Find(lookupType.Name, lookup.Code)); } valueToSet = newValues; } entity.ReviseProperty(assessment.Key, propertyInfo.Name, valueToSet); } response.DataTransferObject = Mapper.Map(entity, entityType, dtoType) as IKeyedDataTransferObject; response.DataTransferObject.Key = assessment.Key; }
public async Task <ActionResult> Edit(string section, string subsection, string nextRoute, long id, long?patientId) { var nextRouteInfo = _routeNavigationService.RecalculateNextRouteInfo(nextRoute); if (!patientId.HasValue) { if (nextRouteInfo.HasSubsection) { return(RedirectToRoute("SubSectionRoute", new { id = id, section = nextRouteInfo.Section, subSection = nextRouteInfo.SubSection })); } return(RedirectToRoute("SectionRoute", new { id = id, section = nextRouteInfo.Section })); } if (_patientAccessControlManager.CanAccessPatient(patientId.Value)) { var dtoType = GetDtoType(subsection ?? section); var sectionDto = Activator.CreateInstance(dtoType) as IKeyedDataTransferObject; TryUpdateModel(sectionDto); var request = new SaveSectionDtoRequest { Section = section, SubSection = subsection, DataTransferObject = sectionDto }; var requestDispatcher = CreateAsyncRequestDispatcher(); requestDispatcher.Add(request); var response = await requestDispatcher.GetAsync <SaveDtoResponse <IKeyedDataTransferObject> > (); if (response.DataTransferObject == null) { throw new HttpException(500, "Section/subsection cannot be saved."); } var view = this.HandleErrorsAndWarnings( response.DataTransferObject.DataErrorInfoCollection, response.Notification, () => { requestDispatcher = CreateAsyncRequestDispatcher(); requestDispatcher.Add(new GetPatientDtoByKeyRequest { PatientKey = patientId.Value }); AddLookupRequests(requestDispatcher, dtoType); var patientResponse = requestDispatcher.Get <GetPatientDtoResponse> (); AddLookupResponsesToViewData(requestDispatcher); ViewData["Patient"] = patientResponse.DataTransferObject; ViewData["AssessmentId"] = sectionDto.Key; ViewData["AssessmentViewModel"] = new AssessmentViewModel(sectionDto.Key, _routeNavigationService, section, subsection, new CompletenessResults("Test", 1, 0)); return(View(sectionDto)); }); if (view != null) { return(view); } if (nextRouteInfo.HasSubsection) { return(RedirectToRoute("SubSectionRoute", new { id = response.DataTransferObject.Key, section = nextRouteInfo.Section, subSection = nextRouteInfo.SubSection })); } return(RedirectToRoute("SectionRoute", new { id = response.DataTransferObject.Key, section = nextRouteInfo.Section })); } return(HttpNotFound()); }