public IActionResult SetTags(int id, bool hasGallery)
        {
            if (!_context.Products.Any(d => d.ProductId == id))
            {
                return(NotFound());
            }

            var model     = new SetTagsToProductViewModel();
            var tags      = _context.Tags.Include(d => d.TagValues).OrderBy(d => d.Name).ToList();
            var tagValues = _context.TagValues.Where(d => d.ProductId == id).ToList();

            var list = new List <TagTransferModel>();

            foreach (var tag in tags)
            {
                list.Add(new TagTransferModel()
                {
                    TagId      = tag.TagId,
                    TagName    = tag.Name,
                    Value      = tagValues.SingleOrDefault(d => d.TagId == tag.TagId)?.Value ?? String.Empty,
                    TagValueId = tagValues.SingleOrDefault(d => d.TagId == tag.TagId)?.TagValueId ?? 0,
                });
            }

            model.TagTransferModels = list;
            model.HasGallery        = hasGallery;
            model.ProductId         = id;

            return(View(model));
        }
        public async Task <IActionResult> SetTags(SetTagsToProductViewModel model)
        {
            var productTags = _context.ProductTags.ToList();
            var tagValues   = _context.TagValues.Where(d => d.ProductId == model.ProductId);

            foreach (var tag in model.TagTransferModels)
            {
                var tagValue = new TagValue()
                {
                    ProductId  = model.ProductId,
                    TagId      = tag.TagId,
                    Value      = tag.Value,
                    TagValueId = tag.TagValueId
                };

                var value = tagValues.Where(d => d.TagId == tagValue.TagId).SingleOrDefault(d => d.ProductId == tagValue.ProductId);

                if (String.IsNullOrWhiteSpace(tag.Value))
                {
                    var tagValueToDelete   = tagValues.Where(d => d.TagId == tagValue.TagId).SingleOrDefault(d => d.TagValueId == tagValue.TagValueId);
                    var productTagToDelete = productTags.Where(d => d.TagId == tagValue.TagId).SingleOrDefault(d => d.ProductId == tagValue.ProductId);

                    if (tagValueToDelete != null)
                    {
                        _context.TagValues.Remove(tagValueToDelete);
                    }

                    if (productTagToDelete != null)
                    {
                        _context.ProductTags.Remove(productTagToDelete);
                    }

                    await _context.SaveChangesAsync();

                    continue;
                }

                if (!tagValues.Contains(tagValue))
                {
                    _context.TagValues.Add(tagValue);

                    _context.ProductTags.Add(new ProductTags()
                    {
                        ProductId = tagValue.ProductId,
                        TagId     = tagValue.TagId
                    });
                }
                else if (value != null)
                {
                    value.Value = tagValue.Value;
                }

                _context.SaveChanges();
            }

            if (!model.HasGallery)
            {
                return(RedirectToAction("Create", "Galleries", new { id = model.ProductId }));
            }

            return(RedirectToAction(nameof(Details), new { id = model.ProductId }));
        }
        public ActionResult SetTags(SetTagsToProductViewModel model)
        {
            var productTags = db.ProductTags.ToList();
            var tagValues   = db.TagValues.Where(d => d.ProductId == model.ProductId);

            if (model.TagTransferModels != null)
            {
                foreach (var tag in model.TagTransferModels)
                {
                    var tagValue = new TagValue()
                    {
                        ProductId = model.ProductId,
                        TagId     = tag.TagId,
                        Value     = tag.Value,
                        Id        = tag.TagValueId
                    };

                    var value = tagValues.Where(d => d.TagId == tagValue.TagId)
                                .SingleOrDefault(d => d.ProductId == tagValue.ProductId);

                    if (String.IsNullOrWhiteSpace(tag.Value))
                    {
                        var tagValueToDelete = tagValues.Where(d => d.TagId == tagValue.TagId)
                                               .SingleOrDefault(d => d.Id == tagValue.Id);
                        var productTagToDelete = productTags.Where(d => d.TagId == tagValue.TagId)
                                                 .SingleOrDefault(d => d.ProductId == tagValue.ProductId);

                        if (tagValueToDelete != null)
                        {
                            db.TagValues.Remove(tagValueToDelete);
                        }

                        if (productTagToDelete != null)
                        {
                            db.ProductTags.Remove(productTagToDelete);
                        }

                        db.SaveChanges();
                        continue;
                    }

                    if (!tagValues.Any(d => d.Id == tagValue.Id))
                    {
                        db.TagValues.Add(tagValue);

                        db.ProductTags.Add(new ProductTags()
                        {
                            ProductId = tagValue.ProductId,
                            TagId     = tagValue.TagId
                        });
                    }
                    else if (value != null)
                    {
                        value.Value = tagValue.Value;
                    }

                    db.SaveChanges();
                }
            }

            if (db.Products.FirstOrDefault(d => d.Id == model.ProductId)?.GalleryId == null)
            {
                return(RedirectToAction("SetGallery", "Products", new { id = model.ProductId }));
            }

            return(RedirectToAction(nameof(Details), new { id = model.ProductId }));
        }