.net . Net5核心API:在Post操作中,Dictionary对象不是在[FromForm]中接收,而是在[FromBody]中接收

zazmityj  于 2022-12-20  发布在  .NET
关注(0)|答案(3)|浏览(276)

我有两个动作

[HttpPost("MyFromForm")]
        public async Task<IActionResult> MyFromForm([FromForm] RequestExample request)
        {
            return new OkObjectResult(request);
        }

        [HttpPost("MyFromBody")]
        public async Task<IActionResult> MyFromBody([FromBody] RequestExample request)
        {
            return new OkObjectResult(request);
        }

该类只包含一个Dictionary类型的属性

public class RequestExample
    {
        public Dictionary<string, string> DeviceDetails { get; set; }
    }

请求

{
  "deviceDetails": {
    "additionalProp1": "string",
    "additionalProp2": "string",
    "additionalProp3": "string"
  }
}

如果我使用swagger将数据发送到这些方法,具有FromBody的方法正在工作,但具有FromForm的方法不工作。

  • 使用:FromBody*,我能够接收请求

    中的字典
  • 使用:FromForm*,我无法接收请求

    中的字典
    **问题:**为什么我无法接收FromForm类型请求中的对象?
pjngdqdw

pjngdqdw1#

看起来您没有更改请求主体类型。FromForm属性用于从内容类型application/x-www-form-urlencoded发送的提交表单中传入的数据,而FromBody将以默认方式解析模型,在大多数情况下,content-type application/json从请求主体Read this for more发送。尝试更改它,最好使用Postman。

nkoocmlb

nkoocmlb2#

您没有发送有效的X FORM URL编码数据:
举个例子

curl -d "additionalProp1=nice&additionalProp2=woohoo" -H "Content-Type: application/x-www-form-urlencoded" -X POST http://localhost:7002/Abc/MyFromForm

你正在尝试发送一个json字符串作为一个表单字典.
表单编码的值应该用与号分隔,键或值上不带引号。
另外,使用multipart/form-data不是发送表单数据,至少一般来说不是。multipart/form-data用于上载文件或二进制数据,而不是文本字段。
您应该使用**-d代替-F内容类型:应用程序/x-www-表单-网址编码而不是多部分/表单-数据**

ssm49v7z

ssm49v7z3#

由于要通过JSON,请执行以下操作:变更

[HttpPost("MyFromForm")]
    public async Task<IActionResult> MyFromForm([FromForm] RequestExample request)
    {
        return new OkObjectResult(request);
    }

[HttpPost("MyFromForm")]
    public async Task<IActionResult> MyFromForm([FromBody] RequestExample request)
    {
        return new OkObjectResult(request);
    }

相关问题