【问题标题】:How to post list of objects multipart form-data in Asp Net Core Web Api如何在 Asp Net Core Web Api 中发布对象多部分表单数据列表
【发布时间】:2021-06-26 01:45:30
【问题描述】:

我想将一个或多个产品(取决于用户选择的数字)发布到我的 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; }
}

这个类是另一个名为 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,其中只有文本字段,现在我尝试这个仅用于添加产品(外键),重点是制作两个不同的请求,你认为它是解决这类问题的好方法吗?)

非常感谢!!

【问题讨论】:

    标签: c# asp.net-core asp.net-core-webapi


    【解决方案1】:

    我找到了我需要的解决方案。我最终创建了一个端点来接收 LayoutNumbero1 数据和 Products 数据(外键)。我刚刚将 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++;
                }
    

    这是一个例子,我用两个产品创建了一个布局

    【讨论】:

      猜你喜欢
      • 2020-08-14
      • 2019-08-06
      • 2014-01-08
      • 2021-12-15
      • 2021-03-14
      • 2017-06-06
      • 2022-01-10
      • 2015-10-31
      相关资源
      最近更新 更多