在测试ASP.NET Core API
项目的时候,发现后台接口参数为类型对象,对于PostMan和Ajax的Post方法传Json数据都获取不到相应的值,后来在类型参数前面加了一个[FromBody]属性才获取到。但是我看微软官方文档演示代码中并没有添加[FromBody],难道是微软官方文档写错了,按道理应该不会。Google里看到一片篇文章里的一个细节,又追回微软官方文档发现可行,于是记下去掉这个烦人的[FromBody]过程
修改之前测试

后台通过Visual Studio生成ASP.NET Core API项目之后,在Controller里添加如下代码
// POST: api/Todo [HttpPost] public async Task<ActionResult<TodoItem>>
PostTodoItem(TodoItem todoItem) { _context.TodoItems.Add(todoItem); await
_context.SaveChangesAsync(); return CreatedAtAction("GetTodoItem", new { id =
todoItem.Id }, todoItem); }
postMan调用

如图所示,name的值为walk dog,后台api获取结果如第三张图所示:


Jquery调用

如图所示,前端会将页面填写的值进行序列化,但是后端依然获取不到值:


返回结果

不论是postMan调用还是ajax调用,后台都获取不到name值和isComplete的值


增加[FromBody]

测试如下:发现可以获取到相应的值,但是如果每个Post方法并含有类型参数的请求前面都添加这么一个属性,相比以前的Asp.Net Api
操作有点不习惯,甚至多余


进行修改

增加一个Contrller,命名为BaseController, 并继承Controller ,代码如下所示:
public class BaseController: Controller { }
然后在BaseController类上增加属性[ApiController],最终如下图所示:


最后修改所有API控制器的父类,改为继承BaseController


修改之后测试

如图所示,此时可以看到已经没有[FromBody]了,需要注意一点是请求的ContentType必须为:application/json


总结


如果没有该[ApiController]属性,则需要显式定义绑定源属性。如果没有[ApiController]或其他绑定源属性[FromQuery],ASP.NET
Core运行时会尝试使用复杂的对象模型绑定器。复杂对象模型绑定器从值提供程序(具有已定义的顺序)中提取数据。例如,'body model
binder'总是选择加入。