Как создать продукт с несколькими изображениями в ASP. NET Core MVC - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь создать продукт с несколькими изображениями в ASP. NET Core MVC. В контроллер мы можем загрузить информацию о продукте и изображения, но не знаем, как обновить соответствующую информацию об изображениях в базе данных.

Не могли бы вы показать мне код для вставки имени изображения в таблицу изображений?

public class Product
{
        public int Id { get; set; }
        public string Name { get; set; }
        public String Description { get; set; }
        public ICollection<Product_Images> product_Images { get; set; }
}

public class Product_Images
{
        public int ID { get; set; }
        public string ImageName { get; set; }

        public int ProductId { get; set; }

        [ForeignKey("ProductId")]
        public Product product { get; set; }
}
 
public class ProductViewModel
{
    public Product Product { get; set; }
    public IEnumerable<SubCategory> SubCategory { get; set; }
    public List<Product_Images> product_Images { get; set; }
}

public class ProductsController : Controller
{
        private readonly ApplicationDbContext _db;
        private readonly IWebHostEnvironment _hostingEnvironment;

        [BindProperty]
        public ProductViewModel ProductVM { get; set; }

        public ProductsController(ApplicationDbContext db, IWebHostEnvironment hostingEnvironment)
        {
            _db = db;
            _hostingEnvironment = hostingEnvironment;

            ProductVM = new ProductViewModel()
            {
                Category = _db.Category,
                Product = new Models.Product()
            };
        }

        [HttpPost, ActionName("Create")]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> CreatePost()
        {
            ProductVM.Product.SubCategoryId = Convert.ToInt32(Request.Form["SubCategoryId"].ToString());

            if (!ModelState.IsValid)
            {
                return View(ProductVM);
            }

            _db.Product.Add(ProductVM.Product);
            await _db.SaveChangesAsync();

            var ProductFromDb = await _db.Product.FindAsync(ProductVM.Product.Id);

            string webRootPath = _hostingEnvironment.WebRootPath;
            var files = HttpContext.Request.Form.Files;

            if (files.Count > 0)
            {
                foreach (var item in files)
                {
                    var uploads = Path.Combine(webRootPath, "images");
                    var extension = Path.GetExtension(item.FileName);
                    var dynamicFileName = Guid.NewGuid().ToString() + "_" + ProductVM.Product.Id + extension;

                    using (var filesStream = new FileStream(Path.Combine(uploads, dynamicFileName), FileMode.Create))
                    {
                        item.CopyTo(filesStream);
                    }
                }
            }

            await _db.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        }
    }
}

1 Ответ

0 голосов
/ 12 августа 2020

Я пытаюсь создать продукт с несколькими изображениями. Мы можем загрузить информацию о продукте и изображения, но не знаем, как обновить соответствующую информацию об изображениях в базе данных.

Чтобы добавить новый продукт с несколькими изображениями Product_Images в вашу базу данных, вы можете попробовать следующий фрагмент кода .

[HttpPost, ActionName("Create")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> CreatePost()
{
    //your code logic here
    //...

    if (!ModelState.IsValid)
    {
        return View(ProductVM);
    }

    //...

    //create new product

    var newproduct = new Product
    {
        Name = ProductVM.Product.Name,
        Description = ProductVM.Product.Description,
        product_Images = new List<Product_Images> { }
    };

    //...

    string webRootPath = _hostingEnvironment.WebRootPath;
    var files = HttpContext.Request.Form.Files;

    if (files.Count > 0)
    {
        foreach (var item in files)
        {
            var uploads = Path.Combine(webRootPath, "images");
            var extension = Path.GetExtension(item.FileName);
            var dynamicFileName = Guid.NewGuid().ToString() + "_" + ProductVM.Product.Id + extension;

            using (var filesStream = new FileStream(Path.Combine(uploads, dynamicFileName), FileMode.Create))
            {
                item.CopyTo(filesStream);
            }

            //add product Image for new product
            newproduct.product_Images.Add(new Product_Images { ImageName = dynamicFileName });
        }
    }


    await _db.Product.AddAsync(newproduct);
    await _db.SaveChangesAsync();

    return RedirectToAction(nameof(Index));
}
...