【问题标题】:FromBody attributeFromBody 属性
【发布时间】:2019-12-11 01:31:42
【问题描述】:

我有一个如下所述的方法,它将用户作为参数。 为了发送用户参数值,我使用邮递员请求/响应工具。 我的问题是,如果请求在正文请求中已经有用户参数(请参阅邮递员打印屏幕),为什么我需要在动作控制器中直接指定 [FromBody]?删除此属性后,参数发送为空值。

谢谢

[HttpPost("register")]
 public IActionResult Register([FromBody]User user)
 {
  //.. code  here 

 }


public class User
{
    public string Name { get; set; }
    public string  Password { get; set; }
}

【问题讨论】:

  • 您告诉模型绑定器在哪里可以找到User 对象。它不一定在体内

标签: c# asp.net-core-webapi


【解决方案1】:

[FromBody] 指令告诉注册操作在请求的正文中查找用户参数,而不是在其他地方,例如从 URL。因此,删除它会使您的方法感到困惑,这就是您看到空值的原因,因为它不确定在哪里寻找 User 参数。

有关更多信息/学习,请参阅:https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

【讨论】:

  • 但是 post 默认发送请求正文中的数据,为什么要使用 [FormBody] ?
  • @erb601 可以说,对于 POST 请求,默认值是表单数据。如果您想阅读本文,则模型将使用 FromForm 属性绑定(请参阅docs.microsoft.com/en-us/aspnet/core/mvc/models/…) - 如果您在最新版本的 .NET Core 中使用 ApiAttribute 装饰控制器,则默认为 FromBody 用于您期望的复杂类型(@ 987654323@).
【解决方案2】:

对于 ASP.NET Core 中的模型绑定,MVC 和 Web APi 使用相同的模型绑定模式。

有默认的模型绑定,例如表单值、路由值和查询字符串。如果这些绑定失败,它不会抛出错误,并返回 null。

如果您不想添加[FromBody],您可以尝试表单值绑定并从邮递员发送请求,如下所示:

[FromBody] 将覆盖默认数据源并从请求正文中指定模型绑定器的数据源。

您可以参考Model Binding in ASP.NET Core了解详细信息

【讨论】:

  • 但是 post 默认发送请求正文中的数据,为什么要使用 [FormBody] ?
  • 对于Request Body,它可以是form-dataraw。在Asp.Net Core 中,Post 的默认绑定是form-dataform-dataraw 使用了两种不同的绑定方式。 form-data 使用名称-值,raw with jsonJsonFormatter 一起使用。只有一个可以是默认的,并且这种行为是设计使然。
  • 所以,当我使用 [FormBody] 属性时,它会覆盖默认绑定?
  • 是的,[FromBody] 会将模型绑定的默认设置更改为 JsonInputFormatter 绑定模型。
【解决方案3】:

属性 [FromBody] 确保 API 读取邮递员正文中的 JSON 有效负载。欲了解更多信息,请阅读

https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-01-24
  • 2019-05-03
  • 1970-01-01
  • 1970-01-01
  • 2021-10-08
  • 2017-01-03
  • 2018-11-14
  • 1970-01-01
相关资源
最近更新 更多