asp net core Формирование модели с IFormFile и доп. информацией (FormData)

У меня есть приложение-чат. Хочу реализовать отправку сообщений через asp net контроллер:

[HttpPost]
[Route("SendMessage")]
public IActionResult SendMessage([FromForm] InputMessage inputMessage)
{
    // Логика какая-то
}

Модель

В ней у меня есть сам текст сообщения и перечисление файлов.

public class InputMessage
{
    public string MessageText { get; set; }
    public IEnumerable<IFormFile>? Attachments { get; set; }
}

На клиенте создаю эту модель и отправляю в дальнейшем в тот контроллер

export const createInputMessageFormData = (message: InputMessage): FormData => {
  const formData: FormData = new FormData();

  formData.set("MessageText", message.messageText);
  message.attachments.forEach(attachment => {
    formData.append("Attachments", attachment.file);
  });


  return formData;
}

Все прекрасно работает, НО: В модели нет указания типа файла: фотография, .exe или еще что-либо.

Как я могу в formData впихнуть тип к каждому отдельному файлу? Не получается это сделать просто:

message.attachments.forEach(attachment => {
    formData.append("Attachments", attachment); // !attachment имеет указание типа файла! attachment.type
});

formData принимает только строки или blob. Как мне их иерархически вложить друг в друга, чтоб получить примерно следующее в итоговой модели:

public class InputMessage
{
    public string MessageText { get; set; }
    public IEnumerable<Attachment>? Attachments { get; set; }
}
public class Attachment
{
    public string Type { get; set; } // image, .exe, .excel и прочее
    public IFormFile File {get; set; }
}

Рассматриваю вариант, чтоб просто сделать еще одно поле - словарь<имя_файла, тип>, чтоб потом на сервере перебирать все и соотносить, но это ведь не лучшее решение, так?

upd: задача сводится просто к тому, чтоб в form-data добавить сложный объект типа Attachment, который я описал выше на C#, но как его сериализовать в form-data?


Ответы (1 шт):

Автор решения: jorlyf

Решил проблему, изменив лишь формирование FormData:

message.attachments.forEach((attachment, index) => {
    formData.append(`Attachments[${index}].File`, attachment.file);
    formData.append(`Attachments[${index}].Type`, attachment.type);
});
public class InputMessage
{
    public string MessageText { get; set; }
    public IEnumerable<Attachment>? Attachments { get; set; }
}
public class Attachment
{
    public string Type { get; set; } // image, .exe, .excel и прочее
    public IFormFile File {get; set; }
}
→ Ссылка