Forms 无法同时发送表单中的文件和对象

Forms 无法同时发送表单中的文件和对象,forms,asp.net-core,multipart,Forms,Asp.net Core,Multipart,您好,我想知道您如何在表单中发送POCO和文件。 我的问题有两个: 1.到目前为止,当我访问Request.Form.Files[0]并将其复制到一个文件中时,我得到了一个0kb文件。 当我使用[FromBody]作为方法的参数时,如果我想从表单中获取MyPoco对象,我会得到一个415不受支持的类型 表格 <form id="createForm" method="post" enctype="multipart/form-data" action="http://localhost

您好,我想知道您如何在表单中发送
POCO
文件。
我的问题有两个:

  • 1.到目前为止,当我访问
    Request.Form.Files[0]
    并将其复制到一个文件中时,我得到了一个
    0kb
    文件。
  • 当我使用
    [FromBody]
    作为方法的参数时,如果我想从表单中获取
    MyPoco
    对象,我会得到一个
    415
    不受支持的类型
表格

<form id="createForm" method="post" enctype="multipart/form-data" action="http://localhost:8300/api/create">

<input type="text" bind="@model.Name"/>//some binding here
<input type="text" bind="@model.Id"/> //some binding...

<input type="file"/>
</form>

//这里有些装订
//一些装订。。。
控制器

[HttpPost]
        [Route("api/create")]
        public async Task<long> CreateAsync([FromBody] MyPoco poco) { //getting error 415 when using the FromBody 
            try {

                MyPoco poc = poco;
                string path = Path.Combine(
                    Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), 
                    "file.csv"); //copy the input file -> getting 0kb file
                FileStream stream = new FileStream(path, FileMode.Create);
                await this.Request.Form.Files[0].CopyToAsync(stream);
                return 3;
            } catch (Exception) {
                return 0;
            }
        }
[HttpPost]
[路由(“api/创建”)]
公共异步任务CreateAsync([FromBody]MyPoco poco){//使用FromBody时出现错误415
试一试{
MyPoco-poc=poco;
string path=path.Combine(
GetFolderPath(Environment.SpecialFolder.MyDocuments),
“file.csv”);//复制输入文件->获取0kb文件
FileStream stream=新FileStream(路径,FileMode.Create);
等待此.Request.Form.Files[0].CopyToAsync(流);
返回3;
}捕获(例外){
返回0;
}
}

p.S绑定的语法是
blazor
,但在这种情况下它并不重要。

避免使用
[FromBody]
,它将指示ModelBinder读取整个有效负载,然后将其序列化为
MyPoco
的实例

为了实现您的目标,您可以声明您的行动方法如下:

[HttpPost("[action]")]
public IActionResult Test(MyPoco myPoco,IFormFile myfile){
     // now you get the myfile file and the myPoco 
}
然后发送包含完整名称的字段:

<form id="createForm" method="post" enctype="multipart/form-data" action="/api/SampleData/Test">

    <input name="MyPoco.Name" type="text" bind="@model.Name" />
    <input name="MyPoco.Id" type="text" bind="@model.Id" />

    <input name="myfile" type="file" />
    <button type="submit">submit this form</button>
</form>

提交此表格
演示的屏幕截图:


谢谢您的回复。但是,直到我添加了一个定制的
多部分
反序列化程序,它才起作用。@Bercoviciarian奇怪的是,上面的代码在默认情况下对我有效。您还自定义了其他内容吗?在我的
services.AddMvc(options=>options.InputFormatters.Add(MyCustomFormatter))