FormData密钥不通过

时间:2019-05-28 09:40:37

标签: c# jquery asp.net ajax model-view-controller

我使用外部类将对象变量转换为FormData变量。所有键都经过,除了一个是File对象。

这是外部类:https://github.com/therealparmesh/object-to-formdata

这是我创建对象并将其制成FormData的方式

var _documents = [];

for (var i = 0; i < arrayOfFiles.length; i++) {

  var document = {
     File: arrayOfFiles[i].file.nativeFile,
     DocumentId: arrayOfFiles[i].documentId,
     DocumentType: arrayOfFiles[i].documentName
  };

  _documents.push(document);
}

var uploadedInformation = {
       LoanID: 1452465,
       documents: _documents
};

var options = {
   indices: true,
   nulls: true
};

var a = objectToFormData(uploadedInformation, options);

for (var pair of a.entries()) {
     console.log(pair[0] + ', ' + pair[1]);
}

jQuery.ajaxSettings.traditional = true;
$.ajax({
    async: false,
    cache: false,
    contentType: false,
    processData: false,
    type: 'POST',
    url:  '@Url.Action("UploadFile", "Home")',
    data: a
});

控制器代码:


[HttpPost]
        [ActionName("UploadFile")]
        public ActionResult UploadFile(UploadedInformation uploadedInformation)
        {
            _ = Request.Form;
            return View();
        }

UploadedFile类:

public class UploadedInformation
    {

        public long LoanID { get; set; }
        public IEnumerable<Document> Documents { get; set; }

    }

文档类别:

public class Document
{

      public HttpPostedFileBase File { get; set;}
      public string DocumentId { get; set;}
      public string DocumentType { get; set; }
}

File以外,所有项目均绑定完美。 在浏览器中,调试器的键和值是:

LoanID, 1452465
documents[0][File], [object File]
documents[0][DocumentId], 1
documents[0][DocumentType], Passport

_=Request.Form也仅显示3个键,而没有documents[0][File]

更新: 我将控制器更改为

public ActionResult UploadFile(IEnumerable<HttpPostedFileBase> file, IEnumerable<string> documentType, IEnumerable<string>documentId, long loanId){...}

_=Request.Form仍然没有显示file,但是文件列表已填充

另一个更新: 显然,这次文件项仅显示在_=Request.File

1 个答案:

答案 0 :(得分:2)

由于控制器处理请求的文件上传部分的方式,我怀疑您可能需要对过程进行一些调整,并考虑到文件与主要对象分离的事实。

我在下面对您的代码进行了一些调整(请注意,这未经测试,因此您可能需要做一些实验),假设文件的处理顺序与文档相同,然后运行匹配流程在运行自己的进程之前。

控制器代码:


[HttpPost]
        [ActionName("UploadFile")]
        public ActionResult UploadFile(List<HttpPostedFileBase> myFiles, UploadedInformation uploadedInformation)
        {
            for (var i = 0; i <uploadedInformation.Documents.Length; i++)
            {
                uploadedInformation.Documents[i].File = myFiles[i];
            }

            // Do stuff

            return View();
        }

如果无法假定文件的顺序,则可以将文件名添加到数据中,以帮助在服务器端进行匹配

JavaScript

var _documents = [];

for (var i = 0; i < arrayOfFiles.length; i++) {

  var document = {
     File: arrayOfFiles[i].file.nativeFile,
     FileName: arrayOfFiles[i].file.name,
     DocumentId: arrayOfFiles[i].documentId,
     DocumentType: arrayOfFiles[i].documentName
  };

  _documents.push(document);
}