Новому значению модели не присвоен OnPost - PullRequest
1 голос
/ 30 апреля 2019

После загрузки файла и извлечения FileName я не могу присвоить значение моей модели перед обновлением базы данных.Файл загружен правильно, остальные данные в форме обновлены и ошибок не возникает.

Форма:

<form method="post" enctype="multipart/form-data">
    <input asp-for="Product.Name" />
    <input type="file" name="ImageFile" />
    @for(var i = 0; i < 10; i++) {
        <input asp-for="Product.ProductIntervals[i].Name" />
        [...]
    }
</form>

OnPostAsync:

public async Task<IActionResult> OnPostAsync(CreateEditProduct model, IFormFile imageFile)
{

    if (!ModelState.IsValid) return Page();

    if (imageFile != null)
    {
        var fileName = imageFile.FileName;
        var uploadPath = Path.Combine(_hostingEnvironment.WebRootPath, "uploads");
        imageFile.CopyTo(new FileStream(uploadPath, FileMode.Create));
        model.Product.Image = fileName;
    }

    if (await TryUpdateModelAsync(
        model.Product,
        "Product",
        x => x.Name,
        //x => x.Image
    ))
    {

        _dbContext.Update(model.Product);

        foreach (var x in model.Product.ProductIntervals)
        {
            bool newInterval = x.Id == Guid.Empty;

            var interval = new ProductInterval
            {
                Id = newInterval ? Guid.NewGuid() : x.Id,
                Name = x.Name,
                IntervalMonths = x.IntervalMonths,
                IntervalDays = x.IntervalDays,
                Priority = x.Priority,
                ProductId = model.Product.Id,
                Status = x.Status
            };

            if (newInterval)
            {
                await _dbContext.AddAsync(interval);
            }
            else
            {
                _dbContext.Update(interval);
            }
        }

        await _dbContext.SaveChangesAsync();

        return RedirectToPage("./index");

    }

    return Page();

}

Модель:

public class Product
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string Image { get; set; }
    public IList<ProductInterval> ProductIntervals { get; set; }
}

public class CreateEditProduct {

    public Product Product { get; set; }
    public IList<ProductCategory> ProductCategories { get; set; }

}

Я пробовал с / без x => x.Изображение в TryUpdateModelAsync без разницы.

Что не так?

1 Ответ

0 голосов
/ 30 апреля 2019

Я думаю, что вам не хватает связи между вашей моделью и DbContext - если вы не указали ее где-то в той части кода, которую вы упростили.

Например, добавив _dbContext.Update() вызов к вашемуМетод контроллера решает проблему?

public async Task<IActionResult> OnPostAsync(CreateEditProduct model, IFormFile imageFile, string existingImage)
{

    if (!ModelState.IsValid) return Page();

    if (imageFile != null)
    {
        var fileName = imageFile.FileName;
        [...]
        model.Product.Image = fileName;
    }

    if (await TryUpdateModelAsync(
        model.Product,
        "Product",
        x => x.Image,
        [...]
    )){
        _dbContext.Update(model); // or model.Product if you only need to save changes to Product
        await _dbContext.SaveChangesAsync();
    }

В качестве альтернативы вы можете вызвать _dbContext.attach(model); сразу после проверки правильности, чтобы позволить Entity Framework отслеживать связанные изменения в вашей модели.

...