为什么在期望POST主体中的数据时需要FromBody属性

Pas*_*cal 10 http-post angularjs asp.net-core-mvc asp.net-core

我可以将数据发送到服务器,但仅当我使用FromBody-Attribute时.

为什么json数据不会使用Post自动从Body中读取?

后端web api

[HttpPost]
public async Task<IActionResult> Post([FromBody]CreateSchoolyearRequestDTO dto)
{

}
Run Code Online (Sandbox Code Playgroud)

前端angularjs

this.createSchoolyear = function (schoolyear) {
  var path = "/api/schoolyears";
  return $http({
      url: path,
      method: "POST",
      data:  schoolyear,
      contentType: "application/json"
  }).then(function (response) {
      return response;
  });
};
Run Code Online (Sandbox Code Playgroud)

pok*_*oke 19

仅仅因为某些事情是POST请求,没有明确的规则如何传递参数.POST请求仍然可以包含URL中编码的查询参数.期望方法参数是"简单"类型(字符串,整数等)的查询参数.

复杂类型通常应该是POST表单对象.标准的ASP.NET POST请求是表单提交,例如登录时.这些请求中的参数通常被编码为application/x-www-form-urlencoded,基本上是一串键/值对.对于复杂的参数类型,例如表单视图模型对象,这被假定为默认值.

对于所有其他非默认情况,您需要明确表示方法参数的来源,以及如何在请求中传输它.为此,有许多不同的属性:

  • FromBodyAttribute - 对于来自请求正文的参数
  • FromFormAttribute - 对于来自单个表单数据字段的参数
  • FromHeaderAttribute - 对于来自HTTP标头字段的参数
  • FromQueryAttribute - 对于来自URL中编码的查询参数的参数
  • FromRouteAttribute - 对于来自路径数据的参数
  • FromServicesAttribute - 对于应在方法级别注入服务的参数

  • @LukeTO'Brien 是的,ASP.NET Core 故意与经典 ASP.NET MVC/WebAPI 不兼容。因此,您预计会发生重大变化。– 对于 API 控制器,从 ASP.NET Core 2.1 开始,您将能够使用“[ApiController]”属性来启用推断的“FromBody”模型绑定(以及[一些其他约定](https://blogs. msdn.microsoft.com/webdev/2018/02/02/asp-net-core-2-1-roadmap/#mvc)),因此您不再需要每个操作都使用该属性。 (2认同)