Форум программистов, компьютерный форум, киберфорум
C#: ASP.NET MVC
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
1 / 1 / 0
Регистрация: 12.11.2020
Сообщений: 99

Передача значения в <input type="file">

10.09.2023, 05:29. Показов 1328. Ответов 8

Студворк — интернет-сервис помощи студентам
Приветствую! Пишу первый проект на ASP.NET (C#). Это Movie List похожий на тот, что делают в гайдах от Майкрософт, но я его усложнил, добавив фильмам картинки.
Столкнулся с такой проблемой: при редактировании информации поле выбора файла всегда пустое (input type="file"). Получается, чтобы внести любые изменения нужно каждый раз выбирать картинку.
При создании фильма выбранная картинка сохраняется в wwwroot/image, а в БД записывается относительный путь к ней, который используется в src. (отображение работает).
Все остальные данные из БД отображаются в полях корректно.
Пытался явно передавать путь в value. Передаётся, в коде видно, но поле всё равно пустое.
Подскажите, пожалуйста, что с этим можно сделать. Хотябы в какую сторону гуглить)))
Метод Edit в контроллере
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
public async Task<IActionResult> Edit(int? id)
{
    if (id == null || _context.Movie == null)
    {
        return NotFound();
    }
 
    var movie = await _context.Movie.FindAsync(id);
    if (movie == null)
    {
        return NotFound();
    }
    return View(movie);
}
 
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, IFormFile image, [Bind("Id,Title,ReleaseDate,Genre,Imdb,Rating,Image")] Movie movie)
{
    if (id != movie.Id)
    {
        return NotFound();
    }
 
    if (image != null)
    {
 
        string path = "image/" + movie.Title!.Replace(" ", "") + "Cover";
        string extension = Path.GetExtension(image.FileName);
 
        using (var fileStream = new FileStream(_webHostEnvironment.WebRootPath + "/" + path + extension, FileMode.Create))
        {
            await image.CopyToAsync(fileStream);
            movie.Image = (path + extension);
        }
    }
 
    if (ModelState.IsValid)
    {
        try
        {
            _context.Update(movie);
            await _context.SaveChangesAsync();
        }
        catch (DbUpdateConcurrencyException)
        {
            if (!MovieExists(movie.Id))
            {
                return NotFound();
            }
            else
            {
                throw;
            }
        }
        return RedirectToAction(nameof(Index));
    }
    return View(movie);
}
Представление Edit
C#
1
2
3
4
5
<div class="mb-3">
    <label asp-for="Image" class="control-label"></label>
    <input asp-for="Image" type="file" accept="image/jpeg" class="form-control" />
    <span asp-validation-for="Image" class="text-danger"></span>
</div>
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.09.2023, 05:29
Ответы с готовыми решениями:

Передача значения input type="checkbox" в контроллер
Доброго времени суток, форумчане. Есть представление выводящее таблицу со списком пользователей: &lt;div...

<input type='file' size='20'>
dopustim est form i v nem krome vsego est button i text box, pri nazhatii na kotori otkrivaetsa okno 'select file'(dla vibora uzerom...

Как присвоить значение <input type=file value=???>
так не работает.

8
 Аватар для IamRain
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,226
10.09.2023, 06:10
Непонятен вопрос, проблемы с отображением уже загруженной картинки?

Добавлено через 2 минуты
pass-image-from-controller-to-view
0
1 / 1 / 0
Регистрация: 12.11.2020
Сообщений: 99
10.09.2023, 06:39  [ТС]
IamRain, нет, проблема в том, что при пиреходе на Edit само поле пустое, хотя картинка загружена и отображается на главной корректно. И чтобы внести и сохранить любые изменения приходится выбирать картинку заново (чтоб поле заполнилось)
Миниатюры
Передача значения в <input type="file">  
0
 Аватар для IamRain
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,226
10.09.2023, 07:25
Цитата Сообщение от VLADIMIRz01 Посмотреть сообщение
что при пиреходе на Edit само поле пустое,
Так смысл этого поля - загрузка файла на сервер. Вы хотите, чтобы после однократной загрузки в этом поле снова появлялся выбранный файл? Таким образом, при изменении любого произвольного поля и последующей отправки формы эта же самая картинка будет загружена еще раз. Это неправильный UX. - Должна отображаться только загруженная однажды картинка. А input=file устанавливается только при участии пользователя, это поле нельзя менять на стороне js-а:
MDN - input=file
You cannot set the value of a file picker from a script — doing something like the following has no effect:
Добавлено через 3 минуты
Цитата Сообщение от IamRain Посмотреть сообщение
Так смысл этого поля - загрузка файла на сервер.
То есть по вашей задумке правильно должно быть так: при открытии по GET-у Edit формы, сервер говорит: "Я знаю, ты хочешь загрузить свой однажды загруженный файл СНОВА, и я уже установил значение input=file для тебя". Очевидно, это неправильно - должна отображаться просто ранее загруженная картинка с возможностью ее изменить.

Добавлено через 3 минуты
Отключите валидацию на это поле. И можно на бэке принимать просто единую RequestModel (c IFormFile внутри), а не кашу в параметрах, как у вас сейчас.
0
1 / 1 / 0
Регистрация: 12.11.2020
Сообщений: 99
10.09.2023, 09:36  [ТС]
IamRain, да, по идее файл должен был перезаписываться каждый раз. Понимаю, что это не эффективно. Буду искать, как сделать изменение. Спасибо

Добавлено через 34 минуты
IamRain, не могли бы подсказать, как сделать возможность изменения? Сейчас, если убрать поле выбора файла, то при сохранении изменений в БД пишется старый путь переписывается на null и картинка вообще перестаёт отбражаться
0
 Аватар для IamRain
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,226
10.09.2023, 09:57
Цитата Сообщение от VLADIMIRz01 Посмотреть сообщение
й в БД пишется старый путь переписывается на null и картинка вообще перестаёт отбражаться
Попробуйте заменить
C#
25
if (image != null)
на такое:
C#
25
if (image != null && image.Length > 0)
0
1 / 1 / 0
Регистрация: 12.11.2020
Сообщений: 99
10.09.2023, 10:25  [ТС]
IamRain, В таком случае изменения не сохраняются. Возвращает на эту же страницу

Добавлено через 14 минут
IamRain,
Цитата Сообщение от VLADIMIRz01 Посмотреть сообщение
Сейчас, если убрать поле выбора файла, то при сохранении изменений в БД пишется старый путь переписывается на null и картинка вообще перестаёт отбражаться
эту проблемы решил сделав в представлении по аналогии с id
C#
1
2
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<input type="hidden" asp-for="Image" />
0
 Аватар для IamRain
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,226
10.09.2023, 11:55
Цитата Сообщение от VLADIMIRz01 Посмотреть сообщение
В таком случае изменения не сохраняются. Возвращает на эту же страницу
Смотреть где спотыкается; если это валидация по этому полю, то убрать ее.
0
1 / 1 / 0
Регистрация: 12.11.2020
Сообщений: 99
10.09.2023, 19:08  [ТС]
В итоге проблема решена так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
[HttpPost]
[ValidateAntiForgeryToken]
// IFormFile сделал Nullabl
public async Task<IActionResult> Edit(int id, IFormFile image, [Bind("Id,Title,ReleaseDate,Genre,Imdb,Rating,Image")] Movie movie)
{
    if (id != movie.Id)
    {
        return NotFound();
    }
 
    if (image != null)
    {
 
        string path = "image/" + movie.Title!.Replace(" ", "") + "Cover";
        string extension = Path.GetExtension(image.FileName);
 
        using (var fileStream = new FileStream(_webHostEnvironment.WebRootPath + "/" + path + extension, FileMode.Create))
        {
            await image.CopyToAsync(fileStream);
            movie.Image = (path + extension);
        }
    }
 
    if (ModelState.IsValid)
    {
        try
        {
            _context.Update(movie);
            await _context.SaveChangesAsync();
        }
        catch (DbUpdateConcurrencyException)
        {
            if (!MovieExists(movie.Id))
            {
                return NotFound();
            }
            else
            {
                throw;
            }
        }
        return RedirectToAction(nameof(Index));
    }
    return View(movie);
}
А в представление добавил поле для выбора файла
C#
1
2
3
4
5
6
7
8
9
// Скрытое поле со значением Image (чтобы не пропадала картинка после сохранения, когда её не изменяют)
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<input type="hidden" asp-for="Image" />
//поле для выбора картинки (если хотим изменить)
<div class="mb-3">
    <label class="control-label">Change Image</label>
    <input type="file" accept=".jpeg,.jpg,.png" asp-for="Image" class="form-control" />
    @* <span asp-validation-for="Image" class="text-danger"></span> *@
</div>
Потом я вынес сохранение в отдельный метод и добавил проверку того, что выбрана именно картинка, но это уже другая история)))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.09.2023, 19:08
Помогаю со студенческими работами здесь

input type file отправка на почту без загрузки
Здравствуйте! Во время работы столкнулся со следующей проблемой. Работаю на Razor forms на языке C#. Идея была такая - хотел сделать...

Как использовать drag-and-drop в <input type=file name=FILE_NAME>
Здравствуйте. Если можно помогите!!! Есть &lt;input type=file name=FILE_NAME&gt; у меня такая штука. Как записать туда имя файла не...

если поле <INPUT type='file'...> пустое, то CGI просто замирает
Здравствуйте! У меня есть такой CGI: ....... int x = atoi(getenv('CONTENT_LENGTH')); char *str = new char ; for(int...

Как сделать upload файлов без использования <INPUT TYPE=FILE>(или его программное заполнение)?
На клиенте есть VB программа с броузером, которая сама по таймеру должна пересылать файлы на WEB(не по FTP и не по Mail). Список файлов...

Как в поле формы Input type="File" вывести значение по умолчанию?
Привет всем. Загружаю файлы рисунков и описания к ним на сервер. Если не заполнены обязательные поля вывожу об этом сообщение, и при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru