public async Task <IActionResult> Edit(int id, //[Bind("Name,Number,Path,ProductId,EndDate,CreatedDate,ModifiedDate,CreatedUserId,ModifiedUserId,Id")] OrderCardCreateEditVM orderCardVM) { if (id != orderCardVM.Id) { return(NotFound()); } ViewData["EmployeeId"] = new SelectList(_context.Employees .Where(x => x.Department.IsResponsibleDesignWork), "Id", "GetFullName"); if (ModelState.IsValid && orderCardVM.ModulesVM != null) { var selectedModuleTypes = new List <OrderCardCreateEditModuleVM>(); var unSelectedModuleTypes = new List <int>(); // var selectedModuleTypes = orderCardVM.ModulesVM // .Where(x => x.Addresses.Any(a => a)) // .ToList(); foreach (var moduleAddresses in orderCardVM.ModulesVM) { if (moduleAddresses.Addresses.Any(a => a)) { selectedModuleTypes.Add(moduleAddresses); } else { unSelectedModuleTypes.Add(moduleAddresses.Id); } } if (selectedModuleTypes.Count == 0) { ModelState.AddModelError(string.Empty, "Пустая конфигурация модулей!"); return(View(orderCardVM)); } var selectedPlaces = new Dictionary <int, int>(); foreach (var moduleType in selectedModuleTypes) { for (int place = 1, i = 0; i < moduleType.Addresses.Length; i++, place++) { if (moduleType.Addresses[i]) { if (!selectedPlaces.ContainsKey(place)) { selectedPlaces.Add(place, moduleType.Id); } else { ModelState.AddModelError(string.Empty, "Неверная конфигурация модулей!"); return(View(orderCardVM)); } } } } var cardOrder = _mapper.Map <OrderCardCreateEditVM, OrderCard>(orderCardVM); cardOrder.UnSelectedModuleTypes = unSelectedModuleTypes; var currentModules = _context.Modules.Where(x => x.DestinationOrderCardId == cardOrder.Id && x.ModuleType.IsCommunicationDevice) // чтобы не выбирать LPBS .ToList(); /* * .Select( * x => new * { * TypeModuleId = x.ModuleTypeId, * Place = x.Place * }) */ var existingModules = currentModules.Where(x => selectedPlaces.ContainsKey(x.Place) && selectedPlaces[x.Place] == x.ModuleTypeId); // || !selectedPlaces.ContainsKey(x.Place)); /* var currentSelectedPlaces=new Dictionary<int, int>(); * foreach (var module in currentModules) * { * if (!currentSelectedPlaces.ContainsKey(module.Place)) * { * currentSelectedPlaces.Add(module.Place, module.TypeModuleId); * } * else * { * ModelState.AddModelError(string.Empty, "Неверная конфигурация модулей!"); * return View(orderCardVM); * } * } */ var modulesUpdate = new List <Module>(); foreach (var kvp in selectedPlaces) { var existingModule = existingModules.FirstOrDefault(x => x.Place == kvp.Key && x.ModuleTypeId == kvp.Value); var module = new Module() { // тут нужно еще как-то id получить модуля из БД //DestinationOrderCard = cardOrder, DestinationOrderCardId = cardOrder.Id, //ActualOrderCard = cardOrder, ActualOrderCardId = cardOrder.Id, ModuleTypeId = kvp.Value, Place = kvp.Key }; if (existingModule != null) { module.Id = existingModule.Id; } modulesUpdate.Add(module); } /*foreach (var kvp in currentSelectedPlaces) * { * if(selectedPlaces.ContainsKey(kvp.Key)&&selectedPlaces[kvp.Key]==kvp.Value){} * * } */ //cardOrder.Modules = modulesUpdate; //cardOrder.Modules.Add(); try { var entity = _context.OrderCards.Find(cardOrder.Id); _context.Entry(entity).CurrentValues.SetValues(cardOrder); // _context.Entry(entity).State = EntityState.Modified; //_context.Update(cardOrder); var modulesToRemove = currentModules;// _context.Modules.Where(x => x.DestinationOrderCardId == cardOrder.Id); // && !modulesUpdate.Any(m => m.ModuleTypeId == x.ModuleTypeId && m.Place == x.Place)); _context.Modules.RemoveRange(modulesToRemove); await _context.SaveChangesAsync(); // foreach (var moduleToUpdate in modulesUpdate) // { // var moduleEntity = _context.Modules.Find(moduleToUpdate.Id); // _context.Entry(moduleEntity).CurrentValues.SetValues(moduleToUpdate); // } _context.Modules.AddRange(modulesUpdate); //_context.Update(cardOrder); await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!OrderCardExists(cardOrder.Id)) { return(NotFound()); } else { throw; } } return(RedirectToAction(nameof(GetOrderCardsForProduct), new { productId = orderCardVM.ProductId })); } // ViewData["CreatedUserId"] = new SelectList(_context.Users, "Id", "Id", orderCard.CreatedUserId); // ViewData["ModifiedUserId"] = new SelectList(_context.Users, "Id", "Id", orderCard.ModifiedUserId); // ViewData["ProductId"] = new SelectList(_context.Products, "Id", "Name", orderCard.ProductId); return(View(orderCardVM)); }
[ValidateAntiForgeryToken] //[Bind("Name,Number,Path,ProductId,Id")] public async Task <IActionResult> Create([FromForm] OrderCardCreateEditVM orderCardVM) { if (ModelState.IsValid) { if (orderCardVM.ModulesVM != null && orderCardVM.systemUnit != null) { var selectedModuleTypes = new List <OrderCardCreateEditModuleVM>(); var unSelectedModuleTypes = new List <int>(); // var selectedModuleTypes = orderCardVM.ModulesVM // .Where(x => x.Addresses.Any(a => a)) // .ToList(); foreach (var moduleAddresses in orderCardVM.ModulesVM) { if (moduleAddresses.Addresses.Any(a => a)) { selectedModuleTypes.Add(moduleAddresses); } else { unSelectedModuleTypes.Add(moduleAddresses.Id); } } if (selectedModuleTypes.Count == 0) { ViewData["EmployeeId"] = new SelectList(_context.Employees .Where(x => x.Department.IsResponsibleDesignWork), "Id", "GetFullName"); ModelState.AddModelError(string.Empty, "Пустая конфигурация модулей!"); return(View(orderCardVM)); } var selectedPlaces = new Dictionary <int, int>(); foreach (var moduleType in selectedModuleTypes) { for (int place = 1, i = 0; i < moduleType.Addresses.Length; i++, place++) { if (moduleType.Addresses[i]) { if (!selectedPlaces.ContainsKey(place)) { selectedPlaces.Add(place, moduleType.Id); } else { ModelState.AddModelError(string.Empty, "Неверная конфигурация модулей!"); return(View(orderCardVM)); } } } } var cardOrder = _mapper.Map <OrderCardCreateEditVM, OrderCard>(orderCardVM); cardOrder.UnSelectedModuleTypes = unSelectedModuleTypes; try { foreach (var kvp in selectedPlaces) { _context.Add(new Module() { DestinationOrderCard = cardOrder, // ActualOrderCard = cardOrder, ModuleTypeId = kvp.Value, Place = kvp.Key }); } _context.Add(new Module() { DestinationOrderCard = cardOrder, ActualOrderCard = cardOrder, ModuleTypeId = orderCardVM.systemUnit.Id, Place = -1 }); _context.Add(cardOrder); await _context.SaveChangesAsync(); return(RedirectToAction(nameof(GetOrderCardsForProduct), new { productId = cardOrder.ProductId })); } catch (DbUpdateException e) { var exception = e.InnerException; if (exception != null && exception.Message.Contains("IX_OrderCards_Number")) { ModelState.AddModelError("Number", "Такой cерийный № уже используется"); } } } } ViewData["EmployeeId"] = new SelectList(_context.Employees .Where(x => x.Department.IsResponsibleDesignWork), "Id", "GetFullName"); // ViewData["ProductId"] = new SelectList(_context.Products, "Id", "Name", orderCardDTO.ProductId); return(View(orderCardVM)); }