如何 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++;
}
这是一个示例,其中我创建了包含两个产品的布局
我想 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++;
}
这是一个示例,其中我创建了包含两个产品的布局