public async Task <IActionResult> Preview(EF.Blog blog, IFormCollection files)
        {
            var bllPhoto     = new BLL.Photo(unitOfWork);
            var bllBlogPhoto = new BLL.BlogPhoto(unitOfWork);

            if (!String.IsNullOrEmpty(Request.Cookies["preview_blog_photoId"]))
            {
                var id = Convert.ToInt32(Request.Cookies["preview_blog_photoId"]);

                // Delete photo if not in BlogPhotos
                if ((await bllBlogPhoto.Find(new EF.BlogPhoto {
                    PhotoId = id
                })).Count() <= 0)
                {
                    await bllPhoto.Delete(id, _environment);
                }
            }

            // Clear cookies
            Response.Cookies.Delete("preview_blog_title");
            Response.Cookies.Delete("preview_blog_body");
            Response.Cookies.Delete("preview_blog_photoId");

            // Add cookies
            Response.Cookies.Append("preview_blog_title", blog.Title);
            Response.Cookies.Append("preview_blog_body", blog.Body);

            foreach (var file in files.Files)
            {
                if (file.Name == "photo")
                {
                    int?photoId = null;
                    if (file != null && file.Length > 0)
                    {
                        photoId = await bllPhoto.Add(_environment, file);
                    }
                    else
                    {
                        if (blog.BlogId != 0)
                        {
                            var bllBlog = new BLL.Blog(unitOfWork);
                            var blo     = await bllBlog.Get(new EF.Blog {
                                BlogId = blog.BlogId
                            });

                            if (blo.BlogPhoto.Count() > 0)
                            {
                                photoId = blo.BlogPhoto.First().PhotoId;
                            }
                        }
                    }

                    Response.Cookies.Append("preview_blog_photoId", photoId.ToString());
                }
            }

            return(Json("Success!"));
        }
        public async Task <IActionResult> Edit([Bind(Prefix = "Item1")] EF.Blog model, [Bind(Prefix = "Item2")] string tags, [Bind(Prefix = "Item3")] bool isactive, [Bind(Prefix = "Item4")] Dictionary <string, bool> categories, IFormCollection files)
        {
            ViewData["Title"] = "Blog/Edit";

            using (var txn = context.Database.BeginTransaction())
            {
                try
                {
                    model.ModifiedBy = User.Identity.Name;

                    // Update Category
                    // Delete all
                    var bblogcategory = new BLL.BlogCategory(unitOfWork);
                    var cats          = await bblogcategory.Find(new EF.BlogCategory {
                        BlogId = model.BlogId
                    });

                    await bblogcategory.Delete(cats.ToList());

                    // Add
                    foreach (var category in categories.Where(x => x.Value == true))
                    {
                        var c = await new BLL.Category(unitOfWork).Get(new EF.Category {
                            Name = category.Key
                        });
                        await new BLL.BlogCategory(unitOfWork).Add(new EF.BlogCategory {
                            BlogId = model.BlogId, CategoryId = c.CategoryId
                        });
                    }

                    // Update Blog
                    if (!isactive)
                    {
                        model.DateInactive = DateTime.Now;
                    }
                    else
                    {
                        model.DateInactive = null;
                    }

                    await new BLL.Blog(unitOfWork).Edit(model);

                    foreach (var file in files.Files)
                    {
                        if (file.Name == "photo")
                        {
                            // Update Photo
                            IFormFile uploadedImage = file;
                            if (uploadedImage != null && uploadedImage.ContentType.ToLower().StartsWith("image/"))
                            {
                                var bblogphoto = new BLL.BlogPhoto(unitOfWork);
                                var blogphotos = await bblogphoto.Find(new EF.BlogPhoto {
                                    BlogId = model.BlogId
                                });

                                if (blogphotos.Count() > 0)
                                {
                                    await new BLL.Photo(unitOfWork).Delete(blogphotos.First().PhotoId, _environment);
                                }

                                var pid = await new BLL.Photo(unitOfWork).Add(_environment, file);

                                var bp = new EF.BlogPhoto();
                                bp.BlogId  = model.BlogId;
                                bp.PhotoId = pid;
                                await bblogphoto.Edit(bp);
                            }
                        }
                        else if (file.Name == "attachments")
                        {
                            // Add Attachment
                            if (file.Length > 0)
                            {
                                var aid = await new BLL.Attachment(unitOfWork).Add(_environment, file);

                                var ba = new EF.BlogAttachment();
                                ba.BlogId       = model.BlogId;
                                ba.AttachmentId = aid;
                                await new BLL.BlogAttachment(unitOfWork).Add(ba);
                            }
                        }
                    }

                    // Update Tag
                    if (tags != null)
                    {
                        foreach (var tag in tags.Split(','))
                        {
                            var tid = await new BLL.Tag(unitOfWork).Add(new EF.Tag {
                                Name = tag
                            });
                            await new BLL.BlogTag(unitOfWork).Edit(new EF.BlogTag {
                                BlogId = model.BlogId, TagId = tid
                            });
                        }
                    }

                    // Remove unwanted Tag
                    string[] tagsArr;
                    if (tags == null)
                    {
                        tagsArr = new string[] { string.Empty }
                    }
                    ;
                    else
                    {
                        tagsArr = tags.Split(',');
                    }

                    await new BLL.BlogTag(unitOfWork).Clean(tagsArr);

                    txn.Commit();
                }
                catch (Exception ex)
                {
                    txn.Rollback();

                    logger.Error(ex);

                    TempData["notice"] = "Oops! Something went wrong.";

                    return(View(new Tuple <EF.Blog, string, bool, Dictionary <string, bool> >(model, tags, isactive, categories)));
                }
            }

            return(Redirect("~/Main/Blog"));
        }