【问题标题】:.NET Core Web API: multiple [FromBody]?.NET Core Web API:多个 [FromBody]?
【发布时间】:2018-11-06 05:46:28
【问题描述】:

我正在将用 ASP.NET MVC 编写的代码转换为 ASP.NET Core MVC。在转换代码时,我遇到了一个问题。我们使用了一个具有多个参数的方法,如下所示:

[HttpPost]                                                      
public class Search(List<int> ids, SearchEntity searchEntity)           
{   
  //ASP.NET MVC                                                                   
}

但是在 .NET Core 中编码时,ids 参数是null

[HttpPost]                                                      
public class Search([FromBody]List<int> ids,[FromBody]SearchEntity searchEntity)           
{   
  //ASP.NET Core MVC                                                                   
} 

当我将ids 参数放在SearchEntity 类中时,没有问题。但是我有很多这样写的方法。这个问题我该怎么办?

【问题讨论】:

  • 只能有一个FromBody,因为body只能读取一次
  • ids 来自哪里。正文或网址
  • 您使用的是 MVC(来自“视图”的帖子)还是 WebAPI(来自 Ajax/JavaScript 的 http 帖子请求)? [FromBody] 仅用于反序列化 json(或任何其他配置的格式化程序,例如 xml)。对于 MVC 帖子,如果您的数据以 id=1&amp;id=2&amp;id=3&amp;searchEntity.Value=abc123&amp;searchEntity.OtherValue=xyz 的格式发布,您需要 [Bind("Value, OtherValue", Prefix="searchEntity"] 或类似的东西。
  • 来自 MVC 的请求以 multipart/form-data 的形式出现,并且与 url 查询的格式类似 => key=value&amp;key2=value2&amp;key3=value3 其中 Webapi 请求通常是负载中的 xml 或 json,带有 application/jsonapplication/xml哑剧类型
  • SearchEntity 类中使用所有用于搜索的参数不是很有意义吗?如果ids 参数用于查询或过滤,则在SearchEntity 中包含它的属性。

标签: asp.net asp.net-mvc asp.net-core .net-core asp.net-core-mvc


【解决方案1】:

只能有一个FromBody,因为正文只能读取一次

参考Model Binding in ASP.NET Core

每个操作最多可以有一个参数以[FromBody] 修饰。 ASP.NET Core MVC 运行时将读取请求流的责任委托给格式化程序。一旦为某个参数读取了请求流,一般不可能再读取请求流来绑定其他[FromBody]参数。

MVC Core 对如何将模型绑定到动作更加严格。当您想要自定义绑定行为时,您还必须明确指出要绑定数据的位置。

【讨论】:

  • 在核心之前,我能够通过缓存请求流的相关部分来创建一个自定义类来处理多个参数。但是对于核心,如果没有[FromBody],类似的代码将不会触发,因此该解决方案不再有效。太烦人了。
猜你喜欢
  • 1970-01-01
  • 2019-01-01
  • 2021-02-22
  • 2018-11-13
  • 2019-06-29
  • 2021-06-30
  • 2018-11-12
  • 2018-05-08
  • 2021-11-24
相关资源
最近更新 更多