我使用外部类将对象变量转换为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
答案 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);
}