在測試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'總是選擇加入。