.NET Core - FromForm не принимает IEnumerable <int> - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь передать вызов 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]);

Так что это здорово.

Однако, делать то же самое с дополнительными файлами не получается.Бэкэнд читает значение как «null».

EDIT 4

Вот внешний интерфейсный метод, который отправляет этот запрос как requestd

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 Ответ

1 голос
/ 27 мая 2019

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++) {
    <strike>requestObject.append(`AdditionalFiles[${j}]`, dto.AdditionalFiles[j]);</strike>
    <b>requestObject.append(`additionalFiles`, dto.AdditionalFiles[j]);</b>
  }

  return this._http.post(url, requestObject).catch(this.errorHandler);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...