public ActionResult MaterialProductsGrid(int?supplierID)
        {
            using (var um = new UserManager())
            {
                var currentUser = um.ByUsername(User.Identity.Name);
                if (currentUser.SupplierID != null)
                {
                    supplierID = currentUser.SupplierID.GetValueOrDefault();
                }
            }

            var model = new MaterialProductGridModel();
            var materialToProductModels = new List <MaterialToProductModel>();

            using (var mm = new MaterialsManager())
            {
                var products           = mm.ActiveProducts().ToList();
                var materials          = mm.BySupplier(supplierID.GetValueOrDefault()).ToList();
                var materialToProducts = mm.ByManufacturerID(supplierID.GetValueOrDefault()).ToList();

                model.Products  = products.AsEnumerable();
                model.Materials = materials.AsEnumerable();

                // create the list based on our product and material list
                foreach (var material in materials)
                {
                    foreach (var product in products)
                    {
                        materialToProductModels.Add(new MaterialToProductModel
                        {
                            IsActive            = materialToProducts.Any(mp => mp.ProductID == product.ID && mp.MaterialID == material.ID),
                            ProductID           = product.ID,
                            MaterialID          = material.ID,
                            ProductName         = product.Name,
                            MaterialName        = material.Name,
                            MaterialToProductID = materialToProducts.Any(mp => mp.ProductID == product.ID && mp.MaterialID == material.ID) ? materialToProducts.First(mp => mp.ProductID == product.ID && mp.MaterialID == material.ID).ID : 0
                        });
                    }
                }
                model.MaterialProducts = materialToProductModels.AsEnumerable();
            }

            return(View("MaterialProductsGrid", model));
        }
        public ActionResult MaterialProductsGrid(MaterialProductGridModel model)
        {
            List <MaterialToProduct> mpAdd = new List <MaterialToProduct>();
            List <int> mpDelete            = new List <int>();

            foreach (var mp in model.MaterialProducts)
            {
                if (mp.IsActive)
                {
                    // we only need to add new ones since nothing will change with existing ones
                    if (mp.MaterialToProductID == 0)
                    {
                        mpAdd.Add(new MaterialToProduct
                        {
                            ID         = mp.MaterialToProductID,
                            MaterialID = mp.MaterialID,
                            ProductID  = mp.ProductID
                        });
                    }
                }
                else
                {
                    // only need to delete ones that already exist in the database
                    if (mp.MaterialToProductID > 0)
                    {
                        mpDelete.Add(mp.MaterialToProductID);
                    }
                }
            }

            // now update the database by deleting ones and updating others
            using (var mm = new MaterialsManager())
            {
                mm.DeleteMaterialToProducts(mpDelete);
                mm.InsertMaterialToProducts(mpAdd);
            }

            return(RedirectToAction("Index"));
        }