【问题标题】:Saving FormData in .NET Core with Angular使用 Angular 在 .NET Core 中保存 FormData
【发布时间】:2021-05-21 21:14:49
【问题描述】:

我正在尝试使用 Angular 7 保存一个表单,它包含文件和常规数据。

我正在使用它来发送请求

saveCitaBeneficio(cita: Cita) {
    const formData = new FormData();
    for (var prop in cita) {
        formData.append(prop, cita[prop]);
    }

    let headers = new HttpHeaders().append("Content-Type", "multipart/form-data");
    return this.http.post(`/api/BeneficiosOnline`, formData, { headers: headers });
}

这就是我要调用的端点

    [HttpPost]
    [EnableCors()]
    public async Task<IActionResult> Post([FromForm]CitaWebDto cita)
    {
        if (ModelState.IsValid)
        {
            var result = await _helper.SaveCitaBeneficioOnline(cita);
            return StatusCode(201, result);
        }
        return BadRequest(cita);
    }

当使用 Postman 时它工作得很好,但是发送这个表单数据我在后端看到的只是一个空对象,在网络选项卡上我可以看到数据实际上正在发送:

------WebKitFormBoundarybalyvAXgvHxSi7VH
Content-Disposition: form-data; name="correoElectronico"

test@test.com

我也尝试过设置 Content-Disposition 标头,我尝试过不指定任何标头,我尝试过不添加 [FromForm] 装饰器,但我似乎什么也得不到,只有一个空对象.

编辑:

我现在注意到,即使我在发送前更改了 Content-Type 标头,Chrome 网络仍然显示为 application/json,我是不是设置错了?

【问题讨论】:

  • 起初,我看到一个打印错误 - “mulipart/form-data”而不是“multipart/form-data”。
  • @kogonidze 我没有注意到,但是在修复它之后它仍然无法正常工作,我注意到现在查看 Chrome 中的网络选项卡,内容类型仍然是 application/json,甚至设置后
  • 只是避免设置标题。它可以根据formdata自动解释。
  • 还有一个建议是,accept 也有问题。尝试查看邮递员请求。
  • @dotnetstep 即使我没有设置标题它在网络选项卡中显示为“application/json”,而在后端只是一个空对象

标签: angular asp.net-core multipartform-data


【解决方案1】:

尝试使用 Angular 7 保存表单,它包含文件和常规数据。

要将 formdata 对象从 Angular 前端发布到 API 后端,您可以参考以下工作示例。

saveCitaBeneficio(cita: Cita) {
  const formData = new FormData();
  for (var prop in cita) {
    formData.append(prop, cita[prop]);
  }

  return this.http.post(
    `https://xxx/api/BeneficiosOnline`,
    formData
  );
}

接口 Cita

interface Cita {
  correoElectronico: string;
  img?: File;
}

使用测试数据调用函数

this.saveCitaBeneficio({
  correoElectronico: 'test@test.com',
  img: this.fileToUpload
}).subscribe(() => {
  console.log('Success!');
});

模型和动作方法

public class CitaWebDto
{
    public string CorreoElectronico { get; set; }
    public IFormFile Img { get; set; }
}

public async Task<IActionResult> Post([FromForm] CitaWebDto cita)
{
    //...

测试结果

【讨论】:

  • When using Postman it works just fine, however sending this form data all I see on the backend is a null object 要解决此问题,请仔细检查浏览器开发人员工具“网络”选项卡中的实际请求和发布的数据,并将其与您从邮递员发送的工作请求进行比较。
  • 不需要使用formData,你可以发送一个简单的json对象
猜你喜欢
  • 2018-07-06
  • 1970-01-01
  • 2017-02-27
  • 2021-07-26
  • 2021-03-25
  • 2020-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多