public async Task <IActionResult> AlterPizza(int id)
        {
            Matratt maträtt = await dbContext.Matratt
                              .Include(m => m.MatrattProdukt).ThenInclude(mp => mp.Produkt)
                              .SingleOrDefaultAsync(m => m.MatrattId == id);

            if (maträtt == null)
            {
                return(RedirectToAction("Index"));
            }

            ViewData["Title"]  = "Ändra " + maträtt.MatrattNamn;
            ViewData["Legend"] = "Ändra på " + maträtt.MatrattNamn;

            // Convert to viewmodel
            var model = new ViewMatrattModel
            {
                MatrattId   = maträtt.MatrattId,
                Beskrivning = maträtt.Beskrivning,
                MatrattNamn = maträtt.MatrattNamn,
                MatrattTyp  = maträtt.MatrattTyp,
                Pris        = maträtt.Pris,
            };

            await FillMatrattModelAsync(model, maträtt.MatrattProdukt.Select(mp => mp.ProduktId)
                                        .ToList());

            return(View("CreatePizza", model));
        }
        private async Task FillMatrattModelAsync(ViewMatrattModel model, IList <int> selectedProdukts = null)
        {
            // Add existing types
            model.MatrattTypes = new SelectList(await dbContext.MatrattTyp.ToListAsync(),
                                                dataValueField: nameof(MatrattTyp.MatrattTyp1),
                                                dataTextField: nameof(MatrattTyp.Beskrivning),
                                                selectedValue: model.MatrattTyp);

            // Combine lists
            selectedProdukts = selectedProdukts ?? new List <int>();
            model.Produkts?.ForEach(item =>
            {
                if (item.Selected && int.TryParse(item.Value, out int id))
                {
                    selectedProdukts.Add(id);
                }
            });

            // Add all products, with Selected property
            model.Produkts = await dbContext.Produkt
                             .Select(produkt => new SelectListItem
            {
                Value    = produkt.ProduktId.ToString(),
                Text     = produkt.ProduktNamn,
                Selected = selectedProdukts.Contains(produkt.ProduktId),
            }).ToListAsync();
        }
        public async Task <IActionResult> CreatePizza()
        {
            ViewData["Title"]  = "Ny maträtt";
            ViewData["Legend"] = "Skapa ny maträtt";

            var model = new ViewMatrattModel();

            await FillMatrattModelAsync(model);

            return(View(model));
        }
        public async Task <IActionResult> CreatePizza(ViewMatrattModel model)
        {
            ViewData["Title"]  = "Ny maträtt";
            ViewData["Legend"] = "Skapa ny maträtt";

            if (model == null)
            {
                model = new ViewMatrattModel();
            }

            await FillMatrattModelAsync(model);

            // Valid validation?
            if (!ModelState.IsValid)
            {
                return(View("CreatePizza", model));
            }

            // Valid MatrattTyp?
            if (!await dbContext.MatrattTyp.AnyAsync(t => t.MatrattTyp1 == model.MatrattTyp))
            {
                ModelState.AddModelError(nameof(model.MatrattTyp), "Var god ange en giltig kategori!");
                return(View("CreatePizza", model));
            }

            var matratt = new Matratt
            {
                MatrattNamn    = model.MatrattNamn,
                Beskrivning    = model.Beskrivning,
                Pris           = model.Pris,
                MatrattTyp     = model.MatrattTyp,
                MatrattProdukt = null,
            };

            matratt.MatrattProdukt = await(from product in dbContext.Produkt
                                           where model.Produkts.Any(p => p.Selected && p.Value == product.ProduktId.ToString())
                                           select new MatrattProdukt
            {
                Matratt = matratt,
                Produkt = product,
            }).ToListAsync();

            await dbContext.Matratt.AddAsync(matratt);

            await dbContext.SaveChangesAsync();

            ViewData["Message"] = $"Maträtten {model.MatrattNamn} har sparats!";

            return(View("CreatePizza", model));
        }
        public async Task <IActionResult> AlterPizza(ViewMatrattModel model)
        {
            if (model == null)
            {
                return(RedirectToAction("Index"));
            }

            Matratt maträtt = await dbContext.Matratt
                              .Include(m => m.MatrattProdukt).ThenInclude(mp => mp.Produkt)
                              .SingleOrDefaultAsync(m => m.MatrattId == model.MatrattId);

            if (maträtt == null)
            {
                return(RedirectToAction("Index"));
            }

            ViewData["Title"]  = "Ändra " + maträtt.MatrattNamn;
            ViewData["Legend"] = "Ändra på " + maträtt.MatrattNamn;

            await FillMatrattModelAsync(model);

            // Valid validation?
            if (!ModelState.IsValid)
            {
                return(View("CreatePizza", model));
            }

            // Valid MatrattTyp?
            if (!await dbContext.MatrattTyp.AnyAsync(t => t.MatrattTyp1 == model.MatrattTyp))
            {
                ModelState.AddModelError(nameof(model.MatrattTyp), "Var god ange en giltig kategori!");
                return(View("CreatePizza", model));
            }

            maträtt.MatrattNamn = model.MatrattNamn;
            maträtt.Beskrivning = model.Beskrivning;
            maträtt.Pris        = model.Pris;
            maträtt.MatrattTyp  = model.MatrattTyp;

            // Ensure right products listed
            foreach (Produkt product in dbContext.Produkt)
            {
                // Is selected?
                if (model.Produkts.Any(p => product.ProduktId.ToString() == p.Value && p.Selected))
                {
                    // Not already added?
                    if (maträtt.MatrattProdukt.All(mp => mp.ProduktId != product.ProduktId))
                    {
                        maträtt.MatrattProdukt.Add(new MatrattProdukt
                        {
                            Matratt = maträtt,
                            Produkt = product,
                        });
                    }
                }
                // Not selected.
                else
                {
                    // Remove if found
                    foreach (MatrattProdukt mp in maträtt.MatrattProdukt)
                    {
                        if (mp.ProduktId != product.ProduktId)
                        {
                            continue;
                        }

                        maträtt.MatrattProdukt.Remove(mp);
                        break;
                    }
                }
            }

            await dbContext.SaveChangesAsync();

            ViewData["Message"] = $"Maträtten {model.MatrattNamn} har sparats!";

            return(View("CreatePizza", model));
        }