.NET Core-FromForm无法获取IEnumerable <int>

时间:2019-05-22 17:54:04

标签: c# .net asp.net-core-mvc

我正在尝试将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);
}

1 个答案:

答案 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);
}