對於 MVC 視圖應用而言,Action 返回的結果通常是一個 View,即頁面;
而對於 Web API 應用程序來說,則返回相應的資源或者 HTTP 狀態碼。
Controller
根據約定,繼承自位於 Microsoft.AspNetCore.Mvc 命名空間下的 Controller 類,而這個 Controller 類又繼承自 ControllerBase 抽象類。
如果一個類並不滿足上述約定,那么只要為它添加[Controller]特性,仍然能夠將它作為 Controller 處理;反之,如果為一個 Controller 添加[NotController]特性。
[Controller]
public class Blogs
{
}
[NonController]
public class ValueController
{
}
Action
每個 Action 都應返回 IActionResult 類型或ActionResult<T> 類型的值作為 HTTP 請求的結果。
常見的類別,包括
- 狀態碼
- 對象的狀態碼
- 重定向
- 內容
狀態碼
返回一個 HTTP 狀態碼給客戶端
| 對應的狀態碼 | 描述 | ControllerBase中的方法 |
|---|---|---|
| 200 | 操作成功 | Ok() |
| 400 | 錯誤的請求 | BadRequest() |
| 204 | 操作成功,但未返回任何內容 | NoContent() |
| 404 | 請求的資源找不到 | NotFound() |
| 401 | 未授權 | Unauthorized() |
| 415 | 無法處理請求附帶的媒體格式 | 無 |
如果要返回上述狀態碼之外的結果,則可以使用 StatusCode 方法,並為該方法指明具體的狀態碼。
return StatusCode(403);
直接使用狀態碼數字有可能會出錯,更簡單且直觀的方法是,使用Microsoft.AspNetCore.Http 命名空間下的 StatusCodes 靜態類
return StatusCode(Microsoft.AspNetCore.Http.StatusCodes.Status200OK);
對象的狀態碼
這一類結果繼承自 ObjectResult,包括 OkObjectResult、CreatedResult 和 NotFoundObjectResult 等。
public IActionResult DoSomething()
{
var result = new OkObjectResult(new { message = "success", currentDate = DateTime.Now});
return result;
}
重定向
包括 RedirectResult、LocalRedirectResult、RedirectToActionResult 和 RedirectToRouteResult 等。
// 重定向到指定的URL
return Redirect("http://www.asp.net/");
// 重定向到當前應用程序中的另一個URL
return LocalRedirect("/account/login");
// 重定向到指定的Action
return RedirectToAction("login");
// 重定向到指定的路由
return RedirectToRoute("default", new { action = "login", controller = "Login" });
內容
包括 ViewResult、PartialViewResult、JsonResult 和 ContentResult 等,其中 ViewResult 和 PartialViewResult 在 MVC 視圖應用中非常常見,用於返回相應的頁面;JsonResult 用於返回JSON 字符串,ContentResult 用於返回一個字符串。
