我正在尝试将ajax调用传递给REST端点。我已经设置了一个DTO,除了两个参数IEnumerbles之外,所有参数都可以正常工作。
DTO看起来像
public string title{ get; set; }
public IEnumerable<int> idsToSend{ get; set; }
public IEnumerable<IFormFile> AdditionalFiles { get; set; }
控制器方法看起来像
[FromForm] myGreatDTO dto
发送请求时,在网络检查器中,我可以看到请求中确实包含了所有3个属性,并且内容类型标头设置为multipart / form-data
当我在控制器中断点时,我可以看到DTO进入,但是只设置了标题(单个字符串)。数字数组和IFormFiles数组都设置为“ Count = 0”
我已尝试使用Google谷歌搜索,但对此一无所获。谢谢你的指导。
编辑:这是chromes网络检查器所请求的请求:
Content-Disposition: form-data; name="AdditionalFiles"
[object File]
------WebKitFormBoundaryun80WvPO3VUW6BU8
Content-Disposition: form-data; name="idsToSend"
2,3
------WebKitFormBoundaryun80WvPO3VUW6BU8
Content-Disposition: form-data; name="title"
a title
内容类型标题
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryun80WvPO3VUW6BU8
编辑2:以及chrome inspector解析的版本
title: a title
idsToSend: 2,3
AdditionalFiles: [object File]
编辑3: 我已经通过手动组合这些值来使idsToSend正常工作。
所以而不是
requestObject.append('idsToSend', myvaluesarray);
这是一个熄灭的循环
requestObject.append('idsToSend[i]', myvaluesarray[i]);
那太好了。
但是,对AdditionalFiles进行相同操作不起作用。后端将值读取为“ null”。
编辑4
这是按照请求发送此请求的前端角度方法
sendRequest(dto) {
let url = `${this._profileService.root}/document`;
let requestObject = new FormData();
//fill in the base keys
requestObject.append('Title', dto.Title);
for (let i = 0; i < dto.ids.length; i++) {
requestObject.append(`idsToSend[${i}]`, dto.ids[i].toString());
}
for (let j = 0; j < dto.AdditionalFiles.length; j++) {
requestObject.append(`AdditionalFiles[${j}]`, dto.AdditionalFiles[j]);
}
return this._http.post(url, requestObject).catch(this.errorHandler);
}
答案 0 :(得分:1)
IEnumerable<IFormFile>
与简单字段不同。此集合中的每个元素都设计有自己的文件名。无需构造像AdditionalFiles[]
这样的字段名称。
直接使用AdditionalFiles
作为字段名称(而不是AdditionalFiles[]
),因为类型本身已经表明这是一个集合类型。
sendRequest(dto) { let url = `${this._profileService.root}/document`; let requestObject = new FormData(); //fill in the base keys requestObject.append('Title', dto.Title); for (let i = 0; i < dto.ids.length; i++) { requestObject.append(`idsToSend[${i}]`, dto.ids[i].toString()); } for (let j = 0; j < dto.AdditionalFiles.length; j++) {requestObject.append(`AdditionalFiles[${j}]`, dto.AdditionalFiles[j]);requestObject.append(`additionalFiles`, dto.AdditionalFiles[j]); } return this._http.post(url, requestObject).catch(this.errorHandler); }