asp,net core 3.1 的 Controller 和 Action Controller Action

对于 MVC 视图应用而言,Action 返回的结果通常是一个 View,即页面;

而对于 Web API 应用程序来说,则返回相应的资源或者 HTTP 状态码

根据约定,继承自位于 Microsoft.AspNetCore.Mvc 命名空间下的 Controller 类,而这个 Controller 类又继承自 ControllerBase 抽象类。

如果一个类并不满足上述约定,那么只要为它添加[Controller]特性,仍然能够将它作为 Controller 处理;反之,如果为一个 Controller 添加[NotController]特性。

[Controller]
public class Blogs
{
}

[NonController]
public class ValueController
{
}

Action

每个 Action 都应返回 IActionResult 类型或ActionResult<T> 类型的值作为 HTTP 请求的结果。

常见的类别,包括

  1. 状态码
  2. 对象的状态码
  3. 重定向
  4. 内容

状态码

返回一个 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,包括 OkObjectResultCreatedResultNotFoundObjectResult 等。

public IActionResult DoSomething()
{
		var result = new OkObjectResult(new { message = "success", currentDate = DateTime.Now});
		return result;
}

重定向

包括 RedirectResultLocalRedirectResultRedirectToActionResultRedirectToRouteResult 等。

// 重定向到指定的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 等,其中 ViewResultPartialViewResult 在 MVC 视图应用中非常常见,用于返回相应的页面;JsonResult 用于返回JSON 字符串,ContentResult 用于返回一个字符串。