Список идентификаторов GUID пуст при передаче в модель, которая используется [FromForm] в ASP.NET Ядро 2.2

#c# #asp.net-core #swagger

#c# #asp.net-core #развязность

Вопрос:

Редактировать:

ПРОБЛЕМА ЗАКЛЮЧАЕТСЯ В SWAGGER. СМОТРИТЕ ОТВЕТ НА МОЕ СОБСТВЕННОЕ ИСПРАВЛЕНИЕ.

В настоящее время я испытываю некоторые проблемы с передачей списка идентификаторов GUID действию контроллера с помощью HTTP POST и [FromForm] .

Список идентификаторов guid ПУСТ. Если я попытаюсь превратить его в список строк, вместо того, чтобы иметь 3 значения, в списке отображается только 1 значение, и это строка, которая содержит 3 значения, но разделена запятой.

Причина, по которой я использую [FromForm], заключается в том, что мне нужно загрузить файл, но также передать некоторые другие данные в действие.

Я создал пример проекта, который использует swagger, когда вы используете Kestrel для отладки приложения.

bug Конечная точка ожидает список идентификаторов GUID и список строк и выводит то, что вы публикуете. Когда вы публикуете 2 идентификатора guid и 2 строки, вы должны ожидать, что они оба будут напечатаны. В этом случае найдено и напечатано 0 идентификаторов guid и напечатана 1 строка, которая содержит опубликованные вами значения, но разделена запятой.
works Конечная точка использует [FromBody] и работает нормально.

Вот проект:https://github.com/sander1095/FromFormGuidListBug

Для людей, которые не хотят видеть проект:

Контроллер:

 [HttpPost("bug")]
public ActionResult<string> Bug([FromForm] BugModel bugModel)
{
    var message = GetMessage(bugModel);

    return Ok(message);
}
  

Модель:

 public class BugModel
{
    /// <summary>
    /// If you send a GUID it will not appear in this list
    /// </summary>
    public IEnumerable<Guid> Ids { get; set; }


    /// <summary>
    /// If you send 3 strings, the list will contain 1 entry with the 3 string comma separated.
    /// </summary>
    public IEnumerable<string> IdsAsStringList { get; set; }
}
  

Вызов CURL: curl -X POST "https://localhost:5001/api/Bug/bug" -H "accept: text/plain" -H "Content-Type: multipart/form-data" -F "Ids="9dfb212a-a215-4991-9452-3ddf90e21ec0","9dfb212a-a215-4991-9452-3ddf90e21ec0"" -F "IdsAsStringList="9dfb212a-a215-4991-9452-3ddf90e21ec0","9dfb212a-a215-4991-9452-3ddf90e21ec0""

Результат:

Ids пуст, пока IdsAsStringList содержит 1 значение (вместо 2), которое представляет собой 2 строки, вставленные в 1 значение, разделенное запятой.

Комментарии:

1. Вам пришлось бы возвращать List<string> в качестве ответа. Попробуйте это: public ActionResult<List<string>> Bug([FromForm] BugModel bugModel)

2. Проблема заключается в запросе, а не в ответе. Меня не волнует возвращаемое значение, я просто хочу, чтобы данные вводились BugModel правильно

Ответ №1:

Похоже, моя проблема связана с Swagger, А НЕ с ASP.NET Ядро

Когда я выполняю следующую команду CURL, все работает:

curl -X POST "https://localhost:5001/api/Bug/bug" -H "accept: text/plain" -H "Content-Type: multipart/form-data" -F "Ids="9dfb212a-a215-4991-9452-3ddf90e21ec0"" -F "Ids="9dfb212a-a215-4991-9452-3ddf90e21ec0"" -F "IdsAsStringList="9dfb212a-a215-4991-9452-3ddf90e21ec0","9dfb212a-a215-4991-9452-3ddf90e21ec0""

Разница здесь в том, что вместо использования
-F "Ids="9dfb212a-a215-4991-9452-3ddf90e21ec0","9dfb212a-a215-4991-9452-3ddf90e21ec0""
Я использую
-F "Ids="9dfb212a-a215-4991-9452-3ddf90e21ec0"" -F "Ids="9dfb212a-a215-4991-9452-3ddf90e21ec0"" (Повторяющиеся Ids поля.)

Я создал проблему в репозитории swaggerhttps://github.com/domaindrivendev/Swashbuckle.AspNetCore/проблемы/1107

Ответ №2:

Я думаю, что проблема в вашем запросе. При публикации списка я всегда добавляю индексы к имени каждого элемента в списке. Попробуйте изменить имя идентификаторов на Ids[0]=»firstguidhere» Ids =[1]=»secondguidhere».