如何 post Asp Net Core Web Api 中的对象多部分表单数据列表

How to post list of objects multipart form-data in Asp Net Core Web Api

我想 post 一个或多个产品(取决于用户选择的数量)到我的 api,我有这个产品型号:

 public class Product
{
    [Key]
    public int Id { get; set; }

    [Required]
    [StringLength(50)]
    public string DescricaoProduto { get; set; }

    [Required]
    public float Preco { get; set; }

    [Required]
    [StringLength(50)]
    public string Foto { get; set; }

    [Required]
    [NotMapped]
    public IFormFile FotoFile { get; set; }

    public int LayoutNumero1Id { get; set; }
    public LayoutNumero1 LayoutNumero1 { get; set; }
}

此 class 是另一个 class 的外键,称为 LayoutNumero1,如我所说,其中可以是一个或多个产品。我想知道如何创建一个端点,该端点可以使用表单数据(FromForm 类型作为参数)获取此产品列表。现在我有这个:

[HttpPost("AddProductsLayoutN1")]
    public async Task<IActionResult> AddProductsLayoutN1([FromForm] List<Product> produto)
    {
        if (ModelState.IsValid)
        {
            if (produto == null)
            {
                throw new NullReferenceException("Produto model não existe!");
            }

            foreach (var p in produto)
            {
                p.Foto = await SaveImage(p.FotoFile);

                _context.Produtos.Add(p);
                await _context.SaveChangesAsync();
            }
            return Ok(new Response
            {
                Message = "Produto adicionado!",
                IsSucess = true
            });

        }

        return BadRequest(new Response
        {
            Message = "Erro na adição do produto",
            IsSucess = false,
        });
    }

(顺便说一句,我试图在一个单独的函数中添加对象 LayoutNumero1,其中只有文本字段,现在我只尝试添加产品(外键),重点是提出两个不同的要求,您认为它是解决此类问题的好方法吗?)

非常感谢!!

我找到了我需要的解决方案。我最终创建了一个端点来接收 LayoutNumbero1 数据和产品数据(外键)。我只是像这样将 LayoutNumero1 作为参数传递:

 public async Task<IActionResult> AddLayoutNumero1([FromForm] LayoutNumero1 produto)
    {
        //some stuff here for saving in db
    }

我在客户端创建了这个表单数据内容并将其发布到端点:

var formContent = new MultipartFormDataContent();

            var numeroDoProduto = 1;
            var i = 0;

            LayoutNumero1 layout = new LayoutNumero1
            {
                Titulo = dados["Titulo" + numeroDoProduto],
                Descricao = dados["Descricao" + numeroDoProduto],
                ClienteId = id

            };

            formContent.Add(new StringContent(layout.ClienteId.ToString()), "ClienteId");
            formContent.Add(new StringContent(layout.Titulo), "Titulo");
            formContent.Add(new StringContent(layout.Descricao), "Descricao");

            foreach (var dado in dados.Files)
            {
                Produto produto = new Produto
                {
                    DescricaoProduto = dados["DescricaoProduto" + numeroDoProduto],
                    Preco = float.Parse(dados["Preco" + numeroDoProduto]),
                    LayoutNumero1Id = layout.Id
                };

                formContent.Add(new StringContent(produto.Preco.ToString()), "Produtos["+ i + "].Preco");
                formContent.Add(new StringContent(produto.DescricaoProduto), "Produtos[" + i + "].DescricaoProduto");
                formContent.Add(new StringContent(Path.GetFileName(dado.FileName)), "Produtos[" + i + "].Foto");
                formContent.Add(new StreamContent(dado.OpenReadStream()), "Produtos[" + i + "].FotoFile", Path.GetFileName(dado.FileName));

                numeroDoProduto++;
                i++;
            }

这是一个示例,其中我创建了包含两个产品的布局