C# 如何接收发布到ASP.net core 2.1 Web API端点的文件和数据

C# 如何接收发布到ASP.net core 2.1 Web API端点的文件和数据,c#,file-upload,asp.net-core,asp.net-core-2.1,C#,File Upload,Asp.net Core,Asp.net Core 2.1,我正在尝试将一个文件和一些数据(对象列表)上载到ASP.net core 2.1 web api端点 以下代码生成并正确发送预期有效负载: const formData=new formData() formData.append('file',this.file) append('data',JSON.stringify(this.mappings)) axios.post('upload',formData) //{headers:{'content-type':'multipart/for

我正在尝试将一个文件和一些数据(对象列表)上载到ASP.net core 2.1 web api端点

以下代码生成并正确发送预期有效负载:

const formData=new formData()
formData.append('file',this.file)
append('data',JSON.stringify(this.mappings))
axios.post('upload',formData)
//{headers:{'content-type':'multipart/form data'}}可选???
有效负载如下所示:(如chrome开发工具中的“网络”选项卡所示)

----WebKitFormBoundarydAP5tYG5GcFa4ivU
内容配置:表单数据;name=“file”;filename=“Master List.xls”
内容类型:application/vnd.ms-excel
------WebKitFormBoundarydAP5tYG5GcFa4ivU
内容配置:表单数据;name=“数据”
[{“必需”:true,“类型”:“字段”,“值”:“代码”,“列”:1,“文本”:“项目代码”},{“必需”:true,“类型”:“字段”,“值”:“名称”,“列”:2,“文本”:“说明”},{“必需”:true,“类型”:“字段”,“值”:“条形码”,“列”:3,“文本”:“字段”,“值”:“类别”,“列”:null,“文本”:“类别”},{“类型”:“字段”,“值”:“单位”,“列”:null,“文本”:“单位”},{“类型”:“位置”、“值”:1,“列”:6,“文本”:“存储1”}]
------WebKitFormBoundarydAP5tYG5GcFa4ivU--
Web api端点如下所示:

[HttpPost]
[Route("upload")]
//[Consumes("multipart/form-data")]
public Task<ActionResult> _upload([FromForm] Upload obj)
{
    // do something
    return Ok();
}

public class Upload
{
    public Field[] data { get; set; }
    public IFormFile file { get; set; }
}

public class Field
{
    public int col { get; set; }
    public string type { get; set; }
    public string value { get; set; }
}
[HttpPost]
[路由(“上传”)]
//[使用(“多部分/表单数据”)]
公共任务上传([FromForm]upload obj)
{
//做点什么
返回Ok();
}
公共类上载
{
公共字段[]数据{get;set;}
公共文件{get;set;}
}
公共类字段
{
公共整数列{get;set;}
公共字符串类型{get;set;}
公共字符串值{get;set;}
}
我能够接收
文件
,但是
数据
总是空的


请问我遗漏了什么?

不理想,但这种修改很有效

  public class Upload
  {
    public string data { get; set; }
    public IFormFile file { get; set; }
  }

[HttpPost]
[Route("upload")]
[Consumes("multipart/form-data")]
public async Task<ActionResult> _upload([FromForm] Upload o)
{
  List<Field> x = JsonConvert.DeserializeObject<List<Field>>(o.data);

  return Ok();
}
公共类上传
{
公共字符串数据{get;set;}
公共文件{get;set;}
}
[HttpPost]
[路由(“上传”)]
[使用(“多部分/表单数据”)]
公共异步任务上传([FromForm]upload o)
{
列表x=JsonConvert.DeserializeObject(o.data);
返回Ok();
}

尽管似乎没有现成的解决方案可以将JSON数据发送到ASP.NET核心MVC端点,但可以将数据格式化为一组键值对,并按预期解析到
字段[]
。它看起来有点像这样(name=value):

data[][]=值
下面是一个使用显式属性键构建
FormData
的代码示例:

for(设i=0;i
这构建的东西看起来有点像这样:

[HttpPost]
[Route("upload")]
//[Consumes("multipart/form-data")]
public Task<ActionResult> _upload([FromForm] Upload obj)
{
    // do something
    return Ok();
}

public class Upload
{
    public Field[] data { get; set; }
    public IFormFile file { get; set; }
}

public class Field
{
    public int col { get; set; }
    public string type { get; set; }
    public string value { get; set; }
}
数据[0][col]=值
数据[0][type]=值
数据[0][值]=值
下面是一个扩展代码示例,它迭代属性,而不是使用显式键:

for(设i=0;i
最后一个示例假设您需要每个映射的所有iterable属性——在JavaScript中有许多不同的方法来实现这一点,我在这里不一一列举。如果映射是一个简单的对象,那么我提供的代码就足够了

总的来说,这在代码和发送到ASP.NET核心MVC端点的部分数量上都更加冗长。好处是端点可以只接收强类型模型,而不必执行任何额外的JSON解析等