ASP.NET Ядро MVC: загрузка изображения null из входных данных

#c# #asp.net-core-mvc

#c# #asp.net-core-mvc

Вопрос:

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

У меня есть этот код ниже и в контроллере HttpPost , но я получаю null для model.Picture из представления. Идентификатор правильный, я просто не получаю файл.

Модель продукта:

 public partial class Product
{
        public int Id { get; set; }
        public string Name { get; set; }
        public decimal Price { get; set; }
        public string Category { get; set; }
        public decimal CostToMake { get; set; }
        public decimal FinalPrice { get; set; }
        public int? OrderId { get; set; }
        public string Picture { get; set; }

        public virtual Order Order { get; set; }
        public List<CartProduct> CartProduct { get; set; }
}
 

Модель представления продукта:

 public class ProductViewModel
{
        public int Id { get; set; }

        [Required(ErrorMessage = "Please choose image")]        
        public IFormFile Picture { get; set; }
}
 

Контроллер продукта:

 [HttpGet]
public async Task<IActionResult> AddPicture(int id)
{
    return View();
}

[HttpPost]
public async Task<IActionResult> AddPicture(ProductViewModel model)
{
    string uniqueFileName = UploadedFile(model);

    Product product = new Product();
    product.Id = model.Id;
    product.Picture = uniqueFileName;

    _sqlProduct.UpdatePicture(product);

    return RedirectToAction(nameof(GetAllProducts));
}

public string UploadedFile(ProductViewModel model)
{
    string uniqueFileName = null;

    if (model.Picture != null)
    {
        string uploadsFolder = Path.Combine(_webHostEnvironment.WebRootPath, "images");
        uniqueFileName = Guid.NewGuid().ToString()   "_"   model.Picture.FileName;
        string filePath = Path.Combine(uploadsFolder, uniqueFileName);

        using (var fileStream = new FileStream(filePath, FileMode.Create))
        {
            model.Picture.CopyTo(fileStream);
        }
    }

    return uniqueFileName;
}
 

Вид продукта:

 @model WEBManagerZ.ViewModels.ProductViewModel
@{
}

<form asp-action="AddPicture">
    <div class="form-group">
        <label asp-for="Picture" class="control-label"></label>
        <div class="custom-file">
            <input type="file" asp-for="Picture" class="custom-file-input" id="customFile">
            <label class="custom-file-label" for="customFile">Choose file</label>
        </div>
        <span asp-validation-for="Picture" class="text-danger"></span>
    </div>

    <div class="form-group">
        <input type="submit" value="submit" class="btn btn-sm btn-primary rounded-0 text-uppercase" />
    </div>
</form>

@section scripts{
    <script type="text/javascript">       
        $(".custom-file-input").on("change", function () {
            var fileName = $(this).val().split("\").pop();
            $(this).siblings(".custom-file-label").addClass("selected").html(fileName);
        });
    </script>
}
 

Ответ №1:

 <form enctype="multipart/form-data" asp-action="AddPicture">
 

Обнаружена проблема с добавлением enctype в форму.

Комментарии:

1. Aniki прав <form enctype=»multipart/form-data» asp-action=»AddPicture»>