jQuery + C# (.Net 8):将表单文件数组从 Ajax 传递到控制器

问题描述 投票:0回答:1

场景:我正在开发 .Net 8 API,我需要通过 ajax 将由文件和其他表单元素组成的表单数据传递给控制器。

我能够成功传递单个文件,但奇怪的是无法传递文件数组。

(为了简单起见,我缩短了代码)

Javascript

let arrayFiles = [];
arrayFiles.push(fileSelector.files[0]);

formData.append('files', arrayFiles[0]);
formData.append('test', test);
formData.append('saveMode', saveMode);
formData.append('deletedElements', deletedElements);

$.ajax({
    url: '/Test/SaveTest',
    method: 'POST',
    contentType: false,
    processData: false,
    data: formData,
    success: function (res) {
    },
    error: function () {
    }
})

Controller

public async Task<JsonResult> SaveTest(string test, int saveMode, IFormFile files, string deletedElements = "")
{
    var deletedQuestions = deletedElements.DeserializeNodeToList<QuestionDTO>("DeletedQuestions");
    var deletedAnswers = deletedElements.DeserializeNodeToList<AnswerDTO>("DeletedAnswers");

    var testDto = test.DeserializeTest(deletedQuestions, deletedAnswers);
    if (testDto == null) return Json(new { Success = false });

    var saveResult = await _service.CreateTestAsync(testDto, saveMode);
    return Json(saveResult);
}

这样我就可以毫无问题地从表单接收一个 IFormFile 对象,但事实是我需要传递多个文件。

我尝试过:

formData.append('files', arrayFiles); //removed the index to pass the whole array

加:

public async Task<JsonResult> SaveTest(string test, int saveMode, IFormFile[] files, string deletedElements = "")

public async Task<JsonResult> SaveTest(string test, int saveMode, List<IFormFile> files, string deletedElements = "")

无济于事。

有什么帮助吗?

编辑1:我真正需要做的事情。

为了简单起见,我缩短了代码,但实际上

what I really need to do
是传递一个类型的数组:

[string, file]

到控制器,其中“字符串”将包含文件的自定义名称和“文件”文件对象本身。

c# jquery .net ajax upload
1个回答
0
投票

好的,我自己找到了答案,感谢:

将文件数组从 Jquery ajax 发送到控制器操作

关键是下一个:

不必对整个数组执行一个 FormData.append,而是必须执行与图像一样多的附加操作,并保持相同的密钥,因此而不是(例如):

let arrayFiles = [];
arrayFiles.push(fileSelector.files[0]);
arrayFiles.push(fileSelector.files[1]);

formData.append('files', arrayFiles);

你会做:

let arrayFiles = [];
arrayFiles.push(fileSelector.files[0]);
arrayFiles.push(fileSelector.files[1]);
    
formData.append('files', arrayFiles[0]);
formData.append('files', arrayFiles[1]);

编码快乐!

© www.soinside.com 2019 - 2024. All rights reserved.