【问题标题】:How to send an array of object having file with ajax to asp.net MVC controller?如何将具有 ajax 文件的对象数组发送到 asp.net MVC 控制器?
【发布时间】:2020-07-04 17:14:28
【问题描述】:

我一直在尝试使用 ajax 向我的 MVC 控制器发送每行包含一个文件的多行(请参见上图)。 JavaScript 代码-

var formData = new FormData();
$('#assFileTable tbody tr').each(function (index, item) {
    var tr = $(this);
    var description = tr.find('.dTableDescription').val();
    var docType = tr.find('.dTableDocType').val();
    var attachment = $('#row-' + index + '-Attachment').get(0).files[0];

    var assoFile = {
        Description: description,
        DocTypeId: docType,
        Attachment: attachment
    };
    formData.append('assoFiles', assoFile);
});

var request = new Request('/Setting/SaveAssociatedFiles/', {
        method: 'POST',
        body: formData
});
fetch(request).then(response => console.log(response.json()));

控制器方法-

public ActionResult SaveAssociatedFiles(List<TaskAssociatedFileViewModel> assoFiles)
{            
}

型号-

public class TaskAssociatedFileViewModel
{
    public string Description { get; set; }
    public int DocTypeId { get; set; }
    public string FilePath { get; set; }
    public HttpPostedFileBase Attachment { get; set; }
}

控制器方法被调用,但得到 null 而不是发送的数据。我错过了什么还是我必须做不同的事情?

【问题讨论】:

  • 尝试在模型中不包含文件/附件属性的情况下缩小范围,确定它肯定只是导致问题的文件。
  • formData.append('assoFiles' developer.mozilla.org/en-US/docs/Web/API/FormData/append append() 会将新值附加到现有值集的末尾。 - 但是您的 MVC 控制器无法知道这一点.
  • 鉴于上述情况-仅尝试一行(无文件)-如果可行但不适用于多行(无文件),那么您的问题是 formData.append 将您的所有值放入同一把钥匙。 MVC 控制器需要一个 array 值。

标签: javascript jquery ajax asp.net-mvc file-upload


【解决方案1】:

据我了解,您只是在assoFiles 键中发送表格的最后一行

var formData = new FormData();
let allDataArray = [];
    $('#assFileTable tbody tr').each(function (index, item) {
        var tr = $(this);
        var description = $(this).find('.dTableDescription').val();
        var docType = $(this).find('.dTableDocType').val();
        var attachment = $('#row-' + index + '-Attachment').get(0).files[0];

        var assoFile = {
            Description: description,
            DocTypeId: docType,
            Attachment: attachment
        };
        allDataArray.push(assoFile)

    });
    formData.append('assoFiles', allDataArray);
    var request = new Request('/Setting/SaveAssociatedFiles/', {
            method: 'POST',
            body: formData
    });
    fetch(request).then(response => console.log(response.json()));
  1. 创建一个空白数组

    让 allData = []

  2. 在formData空白数组中追加assoFile

    allData.push(assoFile)

  3. formData.append('assoFiles', allData);

【讨论】:

  • 问题:如果是这种情况,那么 OP 不会在其控制器中获取一行数据(最后一行)吗?不为空。这似乎确实是一个问题,也许这将是 OP 遇到的下一个问题。
  • 虽然我认为如果他发布 html 会更清楚,但我发现 var docType = tr.find('.dTableDocType').val();也是。他正在循环表格行,然后我相信它们是一个类名 dTableDocType ,它是输入字段,然后是 tr.find('.dTableDocType').val();根据他的情况,值将为空或空白。检查一次。
  • 不确定您的最后一条评论,因为屏幕截图显示文档类型为select - 所以tr.find(".dTableDocType").val() 将是value= 或所选选项的文本。
  • 好吧,对不起 var tr = $(this);没关系。错过了。
  • @souravsatyam 我试过你的解决方案。但我仍然在我的控制器方法中得到“计数 0”。实际上,是否可以使用 FormData 传递数组?
猜你喜欢
  • 1970-01-01
  • 2013-09-26
  • 1970-01-01
  • 1970-01-01
  • 2020-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多