ASP.NET Core API 接收參數去掉煩人的 [FromBody]

在測試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

Jquery調用

如圖所示,前端會將頁面填寫的值進行序列化,可是後端依然獲取不到值:
ajax

返回結果

不管是postMan調用仍是ajax調用,後臺都獲取不到name值和isComplete的值
json

增長[FromBody]

測試以下:發現能夠獲取到相應的值,可是若是每一個Post方法並含有類型參數的請求前面都添加這麼一個屬性,相比之前的Asp.Net Api 操做有點不習慣,甚至多餘
後端

進行修改

增長一個Contrller,命名爲BaseController, 並繼承Controller ,代碼以下所示:api

public class BaseController: Controller
    {
    }

而後在BaseController類上增長屬性[ApiController],最終以下圖所示:
app

最後修改全部API控制器的父類,改成繼承BaseController
async

修改以後測試

如圖所示,此時能夠看到已經沒有[FromBody]了,須要注意一點是請求的ContentType必須爲:application/json
post

總結

若是沒有該[ApiController]屬性,則須要顯式定義綁定源屬性。若是沒有[ApiController]或其餘綁定源屬性[FromQuery],ASP.NET Core運行時會嘗試使用複雜的對象模型綁定器。複雜對象模型綁定器從值提供程序(具備已定義的順序)中提取數據。例如,'body model binder'老是選擇加入。測試

相關文章
相關標籤/搜索