Пример #1
0
        public IActionResult Create()
        {
            EditNewsViewModel model = new EditNewsViewModel();

            model.Categories = _categoryService.GetCategories();
            return(View(model));
        }
        public IActionResult Create()
        {
            if (session.GetString("user") == null)
            {
                return(RedirectToAction("PageNotFound", "Error"));
            }

            //Images
            var model = new EditNewsViewModel();

            model.Images = context.Images.Include(x => x.News).Where(x => x.News == null).ToList();

            model.News = new News()
            {
                Written = DateTime.Now,
                Author  = context.Users.SingleOrDefault(x => x.UserName.Equals(session.GetString("user")))?.FullName,
                Body    = "",
                Title   = ""
            };

            var categories     = context.Categories.Where(x => !x.Name.Equals("Alle")).ToList();
            var newsCategories = context.HasCategories.Include(x => x.News).Include(x => x.Category)?
                                 .Where(y => y.News.Id == 0 && !y.Category.Name.Equals("Alle"))?
                                 .Select(y => y.Category);

            model.AllCategories = categories.ToList();

            model.Categories            = new string[] { };
            model.UploadImagesViewModel = new UploadImagesViewModel();

            return(View(model));
        }
Пример #3
0
        public EditNewsPage()
        {
            InitializeComponent();

            _editVM        = new EditNewsViewModel();
            BindingContext = _editVM;
        }
Пример #4
0
        public async Task <IActionResult> UpdateNews([FromRoute] int id, [FromBody] EditNewsViewModel model)
        {
            var result = default(ApiResult);

            try
            {
                var news = await context.News.FindAsync(id);

                if (news == null)
                {
                    result = ApiResult.CreateResult(ApiStatus.NotFound, "News not found");
                }
                else
                {
                    context.Entry <News>(news).CurrentValues.SetValues(model);
                    var save = await context.SaveChangesAsync();

                    result = ApiResult.CreateResult(ApiStatus.Ok, "Edited successfully");
                }
            }
            catch (Exception ex)
            {
                result = ApiResult.CreateResult(ApiStatus.ApplicationError, ex.Message);

                return(this.GetActionResult(result));
            }

            return(this.GetActionResult(result));
        }
Пример #5
0
        public void EditNews(EditNewsViewModel inputModel, string newsId)
        {
            this.CheckInputParameter(newsId);

            var news = this.db.News.FirstOrDefault(n => n.Id == newsId);

            news.Content = inputModel.Content;
            news.Title   = inputModel.Title;

            this.db.News.Update(news);
            this.db.SaveChanges();
        }
Пример #6
0
        public async Task <IActionResult> EditNews(Guid newsId, string imageToDeleteName = null)
        {
            // Если есть изображение, которое надо удалить, заходим в тело условия
            if (imageToDeleteName != null)
            {
                // Создаем экземпляр класса картинки и присваиваем ему данные из БД
                NewsImage newsImage = await _websiteDB.NewsImages.FirstOrDefaultAsync(i => i.ImageName == imageToDeleteName);

                // Делаем еще одну проверку. Лучше перебдеть. Если все ок, заходим в тело условия и удаляем изображения
                if (newsImage != null)
                {
                    // Исходные (полноразмерные) изображения
                    FileInfo imageNormal = new FileInfo(_appEnvironment.WebRootPath + newsImage.ImagePathNormal);
                    if (imageNormal.Exists)
                    {
                        imageNormal.Delete();
                    }
                    // И их уменьшенные копии
                    FileInfo imageScaled = new FileInfo(_appEnvironment.WebRootPath + newsImage.ImagePathScaled);
                    if (imageScaled.Exists)
                    {
                        imageScaled.Delete();
                    }
                    // Удаляем информацию об изображениях из БД и сохраняем
                    _websiteDB.NewsImages.Remove(newsImage);
                    await _websiteDB.SaveChangesAsync();
                }
            }

            // Создаем экземпляр класса News и присваиваем ему значения из БД
            News news = await _websiteDB.News.FirstAsync(n => n.Id == newsId);

            // Создаем список изображений из БД, закрепленных за выбранной новостью
            List <NewsImage> images = await _websiteDB.NewsImages.Where(i => i.NewsId == newsId).OrderByDescending(i => i.ImageDate).ToListAsync();

            // Создаем модель для передачи в представление и присваиваем значения
            EditNewsViewModel model = new EditNewsViewModel()
            {
                NewsTitle  = news.NewsTitle,
                NewsBody   = news.NewsBody,
                NewsImages = images,
                // Скрытые поля
                NewsId      = newsId,
                NewsDate    = news.NewsDate,
                UserName    = news.UserName,
                ImagesCount = images.Count
            };

            ViewBag.Title = $"Редактирование новости \"{news.NewsTitle}\"";

            // Передаем модель в представление
            return(View(model));
        }
Пример #7
0
        public IActionResult Edit(int id)
        {
            Article           article = _newsService.GetArticle(id);
            EditNewsViewModel model   = new EditNewsViewModel();

            model.Categories = _categoryService.GetCategories();
            model.Title      = article.Title;
            model.Author     = article.Author;
            model.Category   = article.Category;
            model.Text       = article.Text;
            return(View(model));
        }
Пример #8
0
 public ActionResult EditNews(EditNewsViewModel news)
 {
     if (!ModelState.IsValid)
     {
         return(View(news));
     }
     if (NewsService.Update(news.ToEntity()))
     {
         return(RedirectToAction("Index", "News"));
     }
     return(View());
 }
        public IActionResult Edit(EditNewsViewModel news)
        {
            if (ModelState.IsValid)
            {
                if (_newsRepository.EditPost(news))
                {
                    return(RedirectToAction("Index", "Home"));
                }
            }

            return(View(news));
        }
Пример #10
0
        public IActionResult OverviewImageUrl(EditNewsViewModel model)
        {
            var target = context.News.AsNoTracking().SingleOrDefault(x => x.Id == model.News.Id);

            target.ImageUrl = model.News.ImageUrl;

            context.News.Update(target);

            context.SaveChanges();

            return(RedirectToAction("Edit", "Admin", new { id = target.Id }));
        }
        //======================== EDIT
        public IActionResult Edit(int id)
        {
            var post = _newsRepository.GetPost(id);

            EditNewsViewModel news = new EditNewsViewModel()
            {
                id       = post.id,
                FileName = post.FileName,
                Title    = post.Title
            };

            return(View(news));
        }
Пример #12
0
        public IActionResult Edit(EditNewsViewModel editNewsViewModel)
        {
            if (ModelState.IsValid)
            {
                News news = _mapper.Map <News>(editNewsViewModel);
                _newsService.UpdateNews(news);

                return(RedirectToAction("Index", new { id = news.Id }));
            }

            editNewsViewModel.Categories = new SelectList(_newsService.GetCategories(), "Id", "Title");
            return(View(editNewsViewModel));
        }
Пример #13
0
        public async Task <IActionResult> Edit(EditNewsViewModel input)
        {
            if (!this.ModelState.IsValid)
            {
                return(this.View(input));
            }

            var user = await this.UserManager.GetUserAsync(this.User);

            var result = await this.NewsService.EditAsync(input, user);

            return(this.RedirectToAction("GetNews"));
        }
Пример #14
0
        public IActionResult Edit(int id)
        {
            if (session.GetString("user") == null)
            {
                return(RedirectToAction("PageNotFound", "Error"));
            }
            if (id < 1)
            {
                return(RedirectToAction("PageNotFound", "Error"));
            }

            var model = new EditNewsViewModel();

            if (ModelState.IsValid)
            {
                var targetNews = context.News.SingleOrDefault(x => x.Id == id);
                if (targetNews == null)
                {
                    return(RedirectToAction("PageNotFound", "Error"));
                }

                var imageData = context.Images.Include(x => x.News);

                //Images
                List <Image> images = new List <Image>();

                model.News = new News()
                {
                    Id       = targetNews.Id,
                    Written  = targetNews.Written,
                    Author   = targetNews.Author,
                    Body     = targetNews.Body,
                    Title    = targetNews.Title,
                    ImageUrl = targetNews.ImageUrl
                };
                images = imageData.Where(x => x.News.Id == targetNews.Id).ToList();

                var categories     = context.Categories.Where(x => !x.Name.Equals("Alle")).ToList();
                var newsCategories = context.HasCategories.Include(x => x.News).Include(x => x.Category)?
                                     .Where(y => y.News.Id == id && !y.Category.Name.Equals("Alle"))?
                                     .Select(y => y.Category);

                categories.ToList().ForEach(x => model.AllCategories.Add(x));

                model.Categories            = newsCategories.Select(x => x.Id.ToString()).ToArray();
                model.Images                = images;
                model.UploadImagesViewModel = new UploadImagesViewModel();
            }

            return(View(model));
        }
Пример #15
0
        public IActionResult Edit(int id)
        {
            News news = _newsService.GetNewsById(id);

            if (news == null)
            {
                return(NotFound());
            }
            EditNewsViewModel editNewsViewModel = _mapper.Map <EditNewsViewModel>(news);

            editNewsViewModel.Categories = new SelectList(_newsService.GetCategories(), "Id", "Title");

            return(View(editNewsViewModel));
        }
Пример #16
0
        public IActionResult EditNews(EditNewsViewModel model)
        {
            if (session.GetString("user") == null)
            {
                return(RedirectToAction("PageNotFound", "Error"));
            }

            var news          = model.News;
            var categories    = model.Categories;
            var oldCategories = context.HasCategories.Include(x => x.News).Include(x => x.Category)
                                .Where(y => y.News.Id == news.Id && !y.Category.Name.Equals("Alle"))
                                .Select(y => y.Category).ToList();

            //Update New
            context.News.Update(model.News);
            context.SaveChanges();

            //Remove all categories from news
            foreach (var cat in oldCategories)
            {
                context.HasCategories.Remove(new HasCategory()
                {
                    CategoryId = cat.Id,
                    NewsId     = model.News.Id
                });
            }

            //Add all new categories for news
            var newCategories = new List <Category>();

            foreach (var cat in categories)
            {
                newCategories.Add(context.Categories.FirstOrDefault(x => x.Id.Equals(int.Parse(cat))));
            }

            foreach (var cat in newCategories)
            {
                context.HasCategories.Add(new HasCategory()
                {
                    CategoryId = cat.Id,
                    NewsId     = model.News.Id
                });
            }

            context.SaveChanges();

            return(RedirectToAction("Index", "Admin"));
        }
Пример #17
0
        public ActionResult Edit(EditNewsViewModel news)
        {
            if (ModelState.IsValid)
            {
                var oldNews = db.News.Find(news.NewsId);

                oldNews.Title      = news.Title;
                oldNews.Content    = news.Content;
                oldNews.IsFeatured = news.IsFeatured;
                oldNews.Preview    = string.Format("{0}...", news.Content.ToString().Substring(0, 1));

                db.SaveChanges();
                return(RedirectToAction("Index"));
            }
            return(View(news));
        }
Пример #18
0
        public ActionResult SaveNews(EditNewsViewModel model)
        {
            if (ModelState.IsValid)
            {
                var response = GetCommand <SaveNewsCommand>().ExecuteCommand(model);
                if (response != null)
                {
                    if (model.Id.HasDefaultValue())
                    {
                        Messages.AddSuccess("Created successfully!");
                    }
                    return(WireJson(true, response));
                }
            }

            return(WireJson(false));
        }
Пример #19
0
        public IActionResult CreateNews(EditNewsViewModel model)
        {
            if (session.GetString("user") == null)
            {
                return(RedirectToAction("PageNotFound", "Error"));
            }

            var news       = model.News;
            var categories = model.Categories ?? new string[] { };

            //Update New
            context.News.Add(model.News);
            context.SaveChanges();

            //Add all new categories for news
            var newCategories = new List <Category>();

            foreach (var cat in categories)
            {
                newCategories.Add(context.Categories.FirstOrDefault(x => x.Id.Equals(int.Parse(cat))));
            }

            foreach (var cat in newCategories)
            {
                context.HasCategories.Add(new HasCategory()
                {
                    CategoryId = cat.Id,
                    NewsId     = model.News.Id
                });
            }

            context.SaveChanges();

            var newImages = context.Images.Where(x => x.News == null);

            foreach (var img in newImages)
            {
                img.News = context.News.Last();
                context.Images.Update(img);
            }

            context.SaveChanges();

            return(RedirectToAction("Index", "Admin"));
        }
Пример #20
0
        public async Task <IDeletableEntityRepository <News> > EditAsync(EditNewsViewModel input, ApplicationUser user)
        {
            var uploadResult = await this.Cloudinary.UploadAsync(input.Image);

            var news = AutoMapperConfig.MapperInstance.Map <News>(input);

            news.ImageUrl = uploadResult;
            news.User     = user;
            news.UserId   = user.Id;

            this.NewsRepository.Update(news);

            await this.NewsRepository.SaveChangesAsync();

            await this.UsersRepository.SaveChangesAsync();

            return(this.NewsRepository);
        }
Пример #21
0
        public async Task <IActionResult> EditAsync(EditNewsViewModel editNewsViewModel)
        {
            if (!ModelState.IsValid)
            {
                return(View(editNewsViewModel));
            }

            News otherNewsDbWithSameTitle = this.newsService.GetAll(x => x.Id != editNewsViewModel.Id && x.Title == editNewsViewModel.Title).FirstOrDefault();

            if (otherNewsDbWithSameTitle != null)
            {
                string titleName = nameof(editNewsViewModel.Title);
                this.ModelState.AddModelError(titleName, string.Format("A news with this {0} already exists!", titleName));
                return(View(editNewsViewModel));
            }

            News newsDb = this.newsService.GetAll(x => x.Id == editNewsViewModel.Id).FirstOrDefault();

            if (newsDb == null)
            {
                this.AddValidationErrorsToModelState(new List <string> {
                    "A news with this id doesn't exist"
                });
                return(View("ValidationErrorsWithoutSpecificModel"));
            }

            newsDb.Title   = editNewsViewModel.Title;
            newsDb.Content = editNewsViewModel.Content;

            this.newsService.Save(newsDb);
            bool isSaved = await this.unitOfWork.CommitAsync();

            if (!isSaved)
            {
                TempData["ErrorMessage"] = "Ooops, something went wrong";
                return(View(editNewsViewModel));
            }

            TempData["SuccessMessage"] = "News edited successfully!";
            return(RedirectToListAllActionInCurrentController());
        }
Пример #22
0
        public IActionResult Edit(string id)
        {
            News newsDb = this.newsService.GetAll(x => x.Id == id).FirstOrDefault();

            if (newsDb == null)
            {
                this.AddValidationErrorsToModelState(new List <string> {
                    "A news with this id doesn't exist"
                });
                return(View("ValidationErrorsWithoutSpecificModel"));
            }

            EditNewsViewModel editNewsViewModel = new EditNewsViewModel
            {
                Id      = newsDb.Id,
                Title   = newsDb.Title,
                Content = newsDb.Content
            };

            return(View(editNewsViewModel));
        }
        //================================ EDIT POST
        public bool EditPost(EditNewsViewModel news)
        {
            var post = _context.News.FirstOrDefault(x => x.id == news.id);

            if (news.FormFile != null)
            {
                var nameOfImage      = Path.GetFileNameWithoutExtension(news.FormFile.FileName);
                var extensionOfImage = Path.GetExtension(news.FormFile.FileName);
                var guid             = Guid.NewGuid();

                var newFileName = nameOfImage + guid + extensionOfImage;


                var rootPath = Path.Combine(_webHost.WebRootPath, "images", "PostsGallery", newFileName);

                using (var fileStream = new FileStream(rootPath, FileMode.Create))
                {
                    news.FormFile.CopyTo(fileStream);
                }

                news.FileName = newFileName;


                var previousFileName = post.FileName;
                var deleteImage      = Path.Combine(_webHost.WebRootPath, "images", "PostsGallery", previousFileName);
                File.Delete(deleteImage);
            }


            post.FileName = news.FileName;
            post.Title    = news.Title;

            var result = _context.SaveChanges();

            if (result > 0)
            {
                return(true);
            }
            return(false);
        }
Пример #24
0
        public IActionResult Edit(EditNewsViewModel inputModel, string newsId)
        {
            if (!this.ModelState.IsValid || string.IsNullOrEmpty(newsId))
            {
                var errorModel = this.newsService.GetErrorViewModel(Constants.InvalidNewsInputModelMessage);

                return(this.View(DeleteErrorView, errorModel));
            }

            try
            {
                this.newsService.EditNews(inputModel, newsId);

                return(this.RedirectToAction(Constants.ReadNewsView, Constants.NewsController, new { area = string.Empty, newsId }));
            }
            catch (ArgumentException)
            {
                var errorModel = this.newsService.GetErrorViewModel(Constants.InvalidNewsInputModelMessage);

                return(this.View(DeleteErrorView, errorModel));
            }
        }
Пример #25
0
        public IActionResult ImageUpload(EditNewsViewModel model)
        {
            if (session.GetString("user") == null)
            {
                return(RedirectToAction("PageNotFound", "Error"));
            }

            var image      = model.UploadImagesViewModel.File;
            var targetNews = context.News.SingleOrDefault(x => x.Id == model.News.Id);

            if (ModelState.IsValid)
            {
                string uniqueFileName = null;
                if (image != null)
                {
                    string uploadsFolder = Path.Combine(hostingEnvironment.WebRootPath, @"assets\images\news");
                    uniqueFileName = Guid.NewGuid().ToString() + "_" + image.FileName;
                    string filePath = Path.Combine(uploadsFolder, uniqueFileName);
                    image.CopyTo(new FileStream(filePath, FileMode.Create));

                    context.Images.Add(new Image()
                    {
                        ImageDescription = model.UploadImagesViewModel.Description,
                        ImageUrl         = "/assets/images/news/" + uniqueFileName,
                        News             = targetNews
                    });

                    context.SaveChanges();
                }
            }
            if (targetNews == null)
            {
                return(RedirectToAction("Create", "Admin"));
            }
            else
            {
                return(RedirectToAction("Edit", "Admin", new { id = targetNews.Id }));
            }
        }
Пример #26
0
        public void EditNewsWorksCorrectly()
        {
            var service = this.GetNewsService();

            var inputModel = this.GetNewsCreateInputModel();

            var news = service.CreateNews(inputModel, NewsAuthorId);

            Assert.True(news.Title == NewsTitle);
            Assert.True(news.Content == NewsContent);

            var editModel = new EditNewsViewModel
            {
                Id      = news.Id,
                Content = "Changed Content",
                Title   = "Changed Title"
            };

            service.EditNews(editModel, editModel.Id);

            Assert.True(news.Title == editModel.Title);
            Assert.True(news.Content == editModel.Content);
        }
Пример #27
0
 public IActionResult Edit(EditNewsViewModel model)
 {
     this.newsService.Update(model.Id, model.Title, model.SecondTitle, model.Content, model.CategoryId, model.ImageUrl, model.Approved);
     return(this.RedirectToAction("Index", "Dashboard"));
 }
Пример #28
0
        public async Task <IActionResult> EditNews(EditNewsViewModel model, IFormFileCollection uploads)
        {
            // Проверяем, чтобы размер файлов не превышал заданный объем
            foreach (var file in uploads)
            {
                if (file.Length > 2097152)
                {
                    ModelState.AddModelError("NewsImage", $"Файл \"{file.FileName}\" превышает установленный лимит 2MB.");
                    break;
                }
            }

            // Если все в порядке, заходим в тело условия
            if (ModelState.IsValid)
            {
                // Создаем экземпляр класса News и присваиваем ему значения
                News news = new News()
                {
                    NewsTitle = model.NewsTitle,
                    NewsBody  = model.NewsBody,
                    // Скрытые поля
                    Id       = model.NewsId,
                    NewsDate = model.NewsDate,
                    UserName = model.UserName
                };

                // Далее начинаем обработку загружаемых изображений
                List <NewsImage> newsImages = new List <NewsImage>();
                foreach (var uploadedImage in uploads)
                {
                    // Если размер входного файла больше 0, заходим в тело условия
                    if (uploadedImage.Length > 0)
                    {
                        // Создаем новый объект класса FileInfo из полученного изображения для дальнейшей обработки
                        FileInfo imgFile = new FileInfo(uploadedImage.FileName);
                        // Приводим расширение к нижнему регистру (если оно было в верхнем)
                        string imgExtension = imgFile.Extension.ToLower();
                        // Генерируем новое имя для файла
                        string newFileName = Guid.NewGuid() + imgExtension;
                        // Пути сохранения файла
                        string pathNormal = "/files/images/normal/" + newFileName; // изображение исходного размера
                        string pathScaled = "/files/images/scaled/" + newFileName; // уменьшенное изображение

                        // В операторе try/catch делаем уменьшенную копию изображения.
                        // Если входным файлом окажется не изображение, нас перекинет в блок CATCH и выведет сообщение об ошибке
                        try
                        {
                            // Создаем объект класса SixLabors.ImageSharp.Image и грузим в него полученное изображение
                            using (Image image = Image.Load(uploadedImage.OpenReadStream()))
                            {
                                // Создаем уменьшенную копию и обрезаем её
                                var clone = image.Clone(x => x.Resize(new ResizeOptions
                                {
                                    Mode = ResizeMode.Crop,
                                    Size = new Size(300, 200)
                                }));
                                // Сохраняем уменьшенную копию
                                await clone.SaveAsync(_appEnvironment.WebRootPath + pathScaled, new JpegEncoder { Quality = 50 });

                                // Сохраняем исходное изображение
                                await image.SaveAsync(_appEnvironment.WebRootPath + pathNormal);
                            }
                        }
                        // Если вдруг что-то пошло не так (например, на вход подало не картинку), то выводим сообщение об ошибке
                        catch
                        {
                            // Создаем сообщение об ошибке для вывода пользователю
                            ModelState.AddModelError("NewsImage", $"Файл {uploadedImage.FileName} имеет неверный формат.");

                            // Удаляем только что созданные файлы (если ошибка возникла не на первом файле)
                            foreach (var image in newsImages)
                            {
                                // Исходные (полноразмерные) изображения
                                FileInfo imageNormal = new FileInfo(_appEnvironment.WebRootPath + image.ImagePathNormal);
                                if (imageNormal.Exists)
                                {
                                    imageNormal.Delete();
                                }
                                // И их уменьшенные копии
                                FileInfo imageScaled = new FileInfo(_appEnvironment.WebRootPath + image.ImagePathScaled);
                                if (imageScaled.Exists)
                                {
                                    imageScaled.Delete();
                                }
                            }
                            // Возвращаем модель с сообщением об ошибке в представление
                            return(View(model));
                        }

                        // Создаем объект класса NewsImage со всеми параметрами
                        NewsImage newsImage = new NewsImage()
                        {
                            Id              = Guid.NewGuid(),
                            ImageName       = newFileName,
                            ImagePathNormal = pathNormal,
                            ImagePathScaled = pathScaled,
                            NewsId          = news.Id,
                            ImageDate       = DateTime.Now
                        };
                        // Добавляем объект newsImage в список newsImages
                        newsImages.Add(newsImage);
                    }
                }

                // Если в процессе выполнения не возникло ошибок, сохраняем всё в БД
                if (newsImages != null && newsImages.Count > 0)
                {
                    await cmsDB.NewsImages.AddRangeAsync(newsImages);
                }
                cmsDB.News.Update(news);
                await cmsDB.SaveChangesAsync();

                // Редирект на главную страницу
                return(RedirectToAction("Index", "News"));
            }

            // В случае, если при редактировании пытаться загрузить картинку выше разрешенного лимита, то перестают отображаться уже имеющиеся изображения
            // При перегонке модели из гет в пост, теряется список с изображениями. Причина пока не ясна, поэтому сделал такой костыль
            // Счетчик соответственно тоже обнулялся, поэтому его тоже приходится переназначать заново
            List <NewsImage> images = await cmsDB.NewsImages.Where(i => i.NewsId == model.NewsId).OrderByDescending(i => i.ImageDate).ToListAsync();

            model.NewsImages  = images;
            model.ImagesCount = images.Count;

            // Возврат модели в представление в случае, если запорится валидация
            return(View(model));
        }
Пример #29
0
        public async Task <IActionResult> EditNews(EditNewsViewModel model, IFormFileCollection uploads)
        {
            SettingsNews settings = await _websiteDB.SettingsNews.FirstAsync();

            int imageSize = 1048576 * settings.MaxImageSize;

            // Ищем запись в БД по Id
            News news = await _websiteDB.News.FirstOrDefaultAsync(n => n.Id == model.NewsId);

            // Если запись существует, продолжаем обработку
            if (news != null)
            {
                // Проверяем, чтобы общее количество изображений не превышало установленный лимит
                if (uploads.Count > 3 - model.NewsImagesCount)
                {
                    ModelState.AddModelError("NewsImage", $"Превышен лимит изображений для одной записи: 3");
                }
                else
                {
                    // Проверяем, чтобы размер файлов не превышал заданный объем
                    foreach (var file in uploads)
                    {
                        if (file.Length > imageSize)
                        {
                            ModelState.AddModelError("NewsImage", $"Файл \"{file.FileName}\" превышает установленный лимит {settings.MaxImageSize}MB.");
                            break;
                        }
                    }
                }

                // Если все в порядке, заходим в тело условия
                if (ModelState.IsValid)
                {
                    //News news = await _websiteDB.News.FirstAsync(n => n.Id == model.NewsId);

                    // Обновляем данные
                    news.NewsTitle = model.NewsTitle;
                    news.NewsBody  = model.NewsBody.SpecSymbolsToView();

                    // Далее начинаем обработку загружаемых изображений
                    List <NewsImage> newsImages = new List <NewsImage>();
                    foreach (var uploadedImage in uploads)
                    {
                        // Если размер входного файла больше 0, заходим в тело условия
                        if (uploadedImage.Length > 0)
                        {
                            // Создаем новый объект класса FileInfo из полученного изображения для дальнейшей обработки
                            FileInfo imgFile = new FileInfo(uploadedImage.FileName);
                            // Приводим расширение к нижнему регистру (если оно было в верхнем)
                            string imgExtension = imgFile.Extension.ToLower();
                            // Генерируем новое имя для файла
                            string newFileName = Guid.NewGuid() + imgExtension;
                            // Пути сохранения файла
                            string originalDirectory = "/uploadedfiles/news/images/original/";
                            string scaledDirectory   = "/uploadedfiles/news/images/scaled/";
                            string pathOriginal      = originalDirectory + newFileName; // изображение исходного размера
                            string pathScaled        = scaledDirectory + newFileName;   // уменьшенное изображение

                            // Если такие директории не созданы, то создаем их
                            if (!Directory.Exists(_appEnvironment.WebRootPath + originalDirectory))
                            {
                                Directory.CreateDirectory(_appEnvironment.WebRootPath + originalDirectory);
                            }
                            if (!Directory.Exists(_appEnvironment.WebRootPath + scaledDirectory))
                            {
                                Directory.CreateDirectory(_appEnvironment.WebRootPath + scaledDirectory);
                            }

                            // В операторе try/catch делаем уменьшенную копию изображения.
                            // Если входным файлом окажется не изображение, нас перекинет в блок CATCH и выведет сообщение об ошибке
                            try
                            {
                                // Создаем объект класса SixLabors.ImageSharp.Image и грузим в него полученное изображение
                                using (Image image = Image.Load(uploadedImage.OpenReadStream()))
                                {
                                    // Создаем уменьшенную копию и обрезаем её
                                    var clone = image.Clone(x => x.Resize(new ResizeOptions
                                    {
                                        Mode = ResizeMode.Crop,
                                        Size = new Size(300, 169)
                                    }));
                                    // Сохраняем уменьшенную копию
                                    await clone.SaveAsync(_appEnvironment.WebRootPath + pathScaled, new JpegEncoder { Quality = settings.ImageResizeQuality });

                                    // Сохраняем исходное изображение
                                    await image.SaveAsync(_appEnvironment.WebRootPath + pathOriginal);
                                }
                            }
                            // Если вдруг что-то пошло не так (например, на вход подало не картинку), то выводим сообщение об ошибке
                            catch
                            {
                                // Создаем сообщение об ошибке для вывода пользователю
                                ModelState.AddModelError("NewsImage", $"Ошибка при обработке файла {uploadedImage.FileName}. Обратитесь к администратору сайта.");

                                // Удаляем только что созданные файлы (если ошибка возникла не на первом файле)
                                foreach (var image in newsImages)
                                {
                                    // Исходные (полноразмерные) изображения
                                    FileInfo imageOriginal = new FileInfo(_appEnvironment.WebRootPath + image.ImagePathOriginal);
                                    if (imageOriginal.Exists)
                                    {
                                        imageOriginal.Delete();
                                    }
                                    // И их уменьшенные копии
                                    FileInfo imageScaled = new FileInfo(_appEnvironment.WebRootPath + image.ImagePathScaled);
                                    if (imageScaled.Exists)
                                    {
                                        imageScaled.Delete();
                                    }
                                }
                                // Возвращаем модель с сообщением об ошибке в представление
                                return(View(model));
                            }

                            // Создаем объект класса NewsImage со всеми параметрами
                            NewsImage newsImage = new NewsImage()
                            {
                                Id                = Guid.NewGuid(),
                                ImageName         = newFileName,
                                ImagePathOriginal = pathOriginal,
                                ImagePathScaled   = pathScaled,
                                NewsId            = news.Id,
                                ImageDate         = DateTime.Now
                            };
                            // Добавляем объект newsImage в список newsImages
                            newsImages.Add(newsImage);
                        }
                    }

                    // Если в процессе выполнения не возникло ошибок, сохраняем всё в БД
                    if (newsImages != null && newsImages.Count > 0)
                    {
                        await _websiteDB.NewsImages.AddRangeAsync(newsImages);
                    }
                    _websiteDB.News.Update(news);
                    await _websiteDB.SaveChangesAsync();

                    // Редирект на главную страницу
                    return(RedirectToAction("Index", "News"));
                }

                // В случае, если при редактировании пытаться загрузить картинку выше разрешенного лимита, то перестают отображаться уже имеющиеся изображения
                // При перегонке модели из гет в пост, теряется список с изображениями. Причина пока не ясна, поэтому сделал такой костыль
                // Счетчик соответственно тоже обнулялся, поэтому его тоже приходится переназначать заново
                List <NewsImage> images = await _websiteDB.NewsImages.Where(i => i.NewsId == model.NewsId).OrderByDescending(i => i.ImageDate).ToListAsync();

                model.NewsImages      = images;
                model.NewsImagesCount = images.Count;

                // Возврат модели в представление в случае, если запорится валидация
                return(View(model));
            }
            else
            {
                return(Redirect("/Main/PageNotFound"));
            }
        }
Пример #30
0
        public IActionResult Edit(EditNewsViewModel model)
        {
            var newsId = this.newsService.Update(model.Id, model.Title, model.SecondTitle, model.Content, model.CategoryId, model.ImageUrl, model.Approved);

            return(this.RedirectToAction(nameof(this.ById), new { id = newsId }));
        }