HttpPost、[FromForm] 和绑定集合不起作用

问题描述 投票:0回答:1

我正在使用 Asp.Net Core 8。

我有以下内容:

  public class EventIdsWrapper
  {
    public int[] EventIds { get; set; }
  }

在 Web API 控制器中:

   [Route("transfersLog"), HttpPost()]
   public async Task<IActionResult> GetTransfersLog([FromForm] EventIdsWrapper eventIds)
   {
     var data = await SomeService.GetTransfersLogs(eventIds, db);

     var result = new 
     {
       data = data,
       total = data.Count
     };

     return Ok(result);
   }

这是从浏览器发送的内容:

Chrome Dev tools screenshot

EventIds=1246501&EventIds=1375324&EventIds=1380287&EventIds=1738599&EventIds=1741915&EventIds=1743859&page=1&start=0&limit=25

内容类型为

application/x-www-form-urlencoded; charset=UTF-8

问题是 eventIds.EventIds 为空。为什么无人居住?我缺少什么?根据 docs 这应该有效。他们以此为例:

selectedCourses=1050&selectedCourses=2000

旁注,此代码适用于 Asp.Net Mvc 5.*(使用

[FromBody]
而不是
[FromForm]
)。

更新

此变体有效,我将数组参数直接绑定到表单数据:

   [Route("transfersLog"), HttpPost()]
   public async Task<IActionResult> GetTransfersLog([FromForm] int[] EventIds)
   {
     var data = await SomeService.GetTransfersLogs(eventIds, db);

     var result = new 
     {
       data = data,
       total = data.Count
     };

     return Ok(result);
   }

我仍然很好奇为什么另一个选项不起作用。还有其他情况下,表格中包含更多数据。这是否意味着数组必须与表单的其余部分分开才能成功绑定它们?

蒂亚

asp.net-core asp.net-web-api
1个回答
0
投票

实际上这是asp.net core中众所周知的属性,模型名称最好不要与属性名称相同。

正如您在日志中看到的,当模型为

[FromForm] EventIdsWrapper eventIds
时,属性未正确绑定,因为您的负载仅包含属性名称。一些默认进程已根据您提到的文档执行。

enter image description here

虽然模型是

[FromForm] EventIdsWrapper xxx
,但属性已正确绑定。

enter image description here

总而言之,将参数名称

eventIds
更改为与属性名称
EventIds
不同即可。

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.