controller會處理來自用戶端的HTTP Request,請求中會有一些資訊來往,這些資料會需要經過型別轉換、檢查必填、最大長度及正確性等步驟後我們才能使用,若手動處理這些步驟將會非常繁瑣。 ASP.NET提供Model Binding的功能,可以處理來自使用者請求中的資料,將其綁定到指定型態的資料上,省去繁複的處理程序並提高正確性。
Model Binding可以將HTTP requests的資料轉為指定的資料型態
- 轉換多個來源的資料,例如route data、form fields或query strings等
- 將字串轉為.NET的類別
ApiController屬性
在開始介紹綁定前先介紹ApiController這個屬性
若在Controller中套用[ApiController]這個屬性後會帶來以下影響,其中有一個與綁定有關
- 必須要使用屬性路由(Attribute Routing)
- 自動回應HTTP 400
- 自動套用Model Binding的預設規則,預設規則包含:
- 若HTTP是Request複雜模型,則預設會自動套用[FromBody]屬性
- 若HTTP是Request簡單模型,則預設會自動套用[FromQuery]屬性
- 若參數包含IFormFile或IFormFileCollection會自動推斷content-type為
multipart/form-data
,並自動套用[FromForm]屬性
預設綁定來源及順序
- Form fields
- Request body
- Route data
- Query string parameters
- Uploaded files(僅會綁定到IFormFile或IEnumerable<IFormFile>類別的實體)
指定綁定來源
- [FromBody]:Requet body取值並套用在複雜模型上
- [FromRoute]:從路由資料取值
- [FromQuery]:從Query string中取值
- [FromHeader]:從HTTP標頭取得值
- [FromForm]:從Request body取值,只會套用在IFormFile 或 IFormFileCollection 上
綁定方式
綁定至參數
public Task<IActionResult> Create([FromBody]CreateTodoRequestModel request)
public class CreateTodoRequestModel
{
public string Text { get; set; }
}
綁定至類別屬性
public Task<IActionResult> Create(CreateTodoRequestModel request)
public class CreateTodoRequestModel
{
[FromBody]
public string Text { get; set; }
}