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調用

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

返回結果

不論是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'總是選擇加入。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM