Привязка модели API REST для сложной модели + коллекция + IFormFile - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть действие, которое следует принять в качестве параметра сложной модели.Он должен содержать следующие свойства, которые должны быть привязаны к модели:

  1. IFormFile (привязка уже выполнена)
  2. строковые свойства (привязка уже выполнена)
  3. словарь

У меня проблемы с привязкой к коллекции метаданных класса UploadHeaders.Ни один из способов, которые я попробовал, не работает.Я пытался FormUrlEncodedContent и StringContent (как JSON).Может кто-нибудь указать мне правильное направление, как, кроме IFormFile и строковых свойств, также связать коллекцию?Объект FileMetadata - это коллекция классов, которая имеет только свойства Key и Value.Оба общедоступны.

На стороне сервера:

Модель действия:

public class UploadHeaders
{
    public IFormFile File { get; set; }

    public IList<FileMetadata> Metadata { get; set; }

    public string Author { get; set; }

    public int AuthorId { get; set; }

    public UploadHeaders()
    {
        this.Metadata = new List<FileMetadata>();
    }
}

Действие:

public async Task<ActionResult> Upload([FromForm] UploadHeaders uploadHeaders)
{ 
...
}

Метод на стороне Cient, который вызывает на стороне сервера Загрузитьдействие:

static UploadResponse Upload(string fileToUpload, string fileName)
    {
        var multipartFormDataContent = new MultipartFormDataContent();
        var fileContent = new ByteArrayContent(File.ReadAllBytes(fileToUpload));
        multipartFormDataContent.Add(fileContent, "file", fileName);
        multipartFormDataContent.Add(new StringContent("Author"), "Author");
        multipartFormDataContent.Add(new StringContent("13"), "AuthorId");

        var metadataStringContent = new FormUrlEncodedContent(
            new []
            {
                new KeyValuePair<string, string>("Metadata[0].Key", "key1"),
                new KeyValuePair<string, string>("Metadata[0].Value", "value1")
            }
        );

        multipartFormDataContent.Add(metadataStringContent, "meta");

        var response = httpClient.PostAsync(httpClient.BaseAddress + "Upload", multipartFormDataContent).Result;

        string stringResult = response.Content.ReadAsStringAsync().Result;
        UploadResponse uploadResponse = JsonConvert.DeserializeObject<UploadResponse>(stringResult);
        Console.WriteLine("{0} to {1}, result {2}", fileToUpload, fileName, uploadResponse.Id);
        return uploadResponse;
    }
...