Изменение модели перед добавлением в базу данных в .net core 2.0 - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь создать обновляемую страницу событий для веб-сайта. Событие может иметь или не иметь изображение.

В этой модели я просто использовал bool с именем HasImage - если это так, то на странице дисплея будет отображаться изображение с именем [EventID] .jpg

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

Это упрощенная версия кода ...

        [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Create([Bind("ID,Date,Details,HasImage")] Events events, IFormFile file)
    {
        if (ModelState.IsValid)
        {
            string hasImage = file.Length > 0 ? "False" : "True";
            ModelState.SetModelValue("events.HasImage",  new ValueProviderResult(hasImage, CultureInfo.InvariantCulture));
            // also tried but failed: events.HasImage=hasImage (where hasImage was a bool)
            _context.Add(events);
            await _context.SaveChangesAsync();
            int NewID = cH_Events.ID;
            var fileName = NewID + ".jpg";
            if (file.Length > 0)
            {
                [upload stuff here]
            }

            return RedirectToAction(nameof(Index));
        }
        return View(Events);
    }

Примечание. HasImage не отображается в форме. Это не работает, независимо от того, включаю ли я это в список Bind. Я предполагаю, что это лучший способ сделать это. Альтернативой может быть создание скрытой переменной формы и использование JavaScript.

1 Ответ

0 голосов
/ 15 мая 2018

ОК, после мучительного процесса проб и ошибок я нашел решение.

Вместо того, чтобы пытаться изменить модель перед добавлением в базу данных, я обнаружил, что можно добавить в базу данных как обычно, , затем изменить модель, а затем обновить изменения.

Это пример кода, который работает (я также изменил hasImage на ImageType, чтобы я мог использовать разные типы файлов)

              _context.Add(Events);
            await _context.SaveChangesAsync();
            int NewID = Events.ID;

            if (file != null && file.Length > 0)
            {
                var fileType = System.IO.Path.GetExtension(file.FileName);

                [upload image code]

                cH_Events.ImageType = fileType;
                await _context.SaveChangesAsync();
            }
...