NikFaraday
@NikFaraday
Student full-stack Developer

Как передать массив FormData через ajax?

Здравствуйте!

У меня появилась проблема с передачей данных на сервер. Ситуация:
Мне нужно закинуть на сервер коллекцию неких объектов, так же каждый объект имеет изображение. Вот код:

let packagesForm = new FormData();
for (let i = 0; i < packages.length; i++) {
    packagesForm.append('Image', packages[i].Image);
    packagesForm.append('MeasureUnit', packages[i].MeasureUnit);
    packagesForm.append('VolumeUnit', packages[i].VolumeUnit);
    packagesForm.append('Volume', packages[i].Volume);
    packagesForm.append('Price', packages[i].Price);
    packagesForm.append('ProductId', packages[i].ProductId);
}

$.ajax({
    url: '@Url.Action("Create", "Package")',
    method: 'post',
    data: packagesForm,
    contentType: false,
    processData: false,
    success: (response) => {

    },
    error: (response) => {

    }
})

Тут я получаю из предыдущего запроса ответом id куда сиё дело привязывать и дальше пытаюсь отправить список объектов на сервер.

Вот экшен, куда это всё передается:
[HttpPost]
public async Task<IActionResult> Create(List<CreatePackageHttpPostModel> vm)
{
    return Ok(new { success = true });
}

Проблема в том, что на сервер заходит пустой список. Юзать FormData обязательно, т.к. есть загрузка изображения. Как тут делать? Я что-то упустил, но не могу понять что именно
  • Вопрос задан
  • 70 просмотров
Решения вопроса 2
AshBlade
@AshBlade
Просто хочу быть счастливым
Попробуй [FromForm]
атрибут в аргументе контроллера
Ответ написан
NikFaraday
@NikFaraday Автор вопроса
Student full-stack Developer
Методом тыка, спустя три дня перебора комбинаций методов нашёл один, который работает. Конечно, он меня не удовлетворил в силу способа отправки данных, но это, по крайней мере, работает

let packagesForm = new FormData();
for (let i = 0; i < packages.length; i++) {
    packagesForm.append(`vm[${i}].Image`, packages[i].Image);
    packagesForm.append(`vm[${i}].MeasureUnit`, packages[i].MeasureUnit);
    packagesForm.append(`vm[${i}].VolumeUnit`, packages[i].VolumeUnit);
    packagesForm.append(`vm[${i}].Volume`, packages[i].Volume);
    packagesForm.append(`vm[${i}].Price`, packages[i].Price);
    packagesForm.append(`vm[${i}].ProductId`, Number(response.id));
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
21 нояб. 2024, в 19:31
500 руб./за проект
21 нояб. 2024, в 19:28
200000 руб./за проект
21 нояб. 2024, в 19:09
5000 руб./за проект