<div style="background-color:#226DDD;width:100%;padding:10px;auto;text-indent:2em"><font color=#FFFFFF face="Microsoft YaHei" style="font-size:13px"> 在测试ASP.NET Core API 项目的时候,发现后台接口参数为类型对象,对于PostMan和Ajax的Post方法传Json数据都获取不到相应的值,后来在类型参数前面加了一个[FromBody]属性才获取到。可是我看微软官方文档演示代码中并无添加[FromBody],难道是微软官方文档写错了,按道理应该不会。Google里看到一片篇文章里的一个细节,又追回微软官方文档发现可行,因而记下去掉这个烦人的[FromBody]过程</strong> </font></div>前端
后台经过Visual Studio生成ASP.NET Core API项目以后,在Controller里添加以下代码ajax
// 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); }
如图所示,name的值为walk dog,后台api获取结果如第三张图所示: json
如图所示,前端会将页面填写的值进行序列化,可是后端依然获取不到值: 后端
###返回结果 不管是postMan调用仍是ajax调用,后台都获取不到name值和isComplete的值 api
###增长[FromBody] 测试以下:发现能够获取到相应的值,可是若是每一个Post方法并含有类型参数的请求前面都添加这么一个属性,相比之前的Asp.Net Api 操做有点不习惯,甚至多余 app
<h2 style="background-color:#226DDD;width:100%;color:#FFF;text-indent:1em">进行修改</h2>async
增长一个Contrller,命名为BaseController, 并继承Controller ,代码以下所示:post
public class BaseController: Controller { }
而后在BaseController类上增长属性[ApiController],最终以下图所示: 测试
最后修改全部API控制器的父类,改成继承BaseController spa
<h2 style="background-color:#226DDD;width:100%;color:#FFF;text-indent:1em">修改以后测试</h2>
如图所示,此时能够看到已经没有[FromBody]了,须要注意一点是请求的ContentType必须为:application/json
若是没有该[ApiController]属性,则须要显式定义绑定源属性。若是没有[ApiController]或其余绑定源属性[FromQuery],ASP.NET Core运行时会尝试使用复杂的对象模型绑定器。复杂对象模型绑定器从值提供程序(具备已定义的顺序)中提取数据。例如,'body model binder'老是选择加入。