<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'老是選擇加入。