/// <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;
        }
示例#2
0
        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());
        }