在 ASP.NET Core 中,ActionResult是一个抽象基类,框架提供了大量继承自它的具体返回类型。为了方便记忆和查阅,以下按功能维度对所有常见的ActionResult派生类进行归纳总结:
1. 数据与内容响应类
用于向客户端返回具体的数据载荷或原始文本。
| 返回类型 | 便捷方法 | 核心作用 | 典型场景 |
|---|
| OkObjectResult | Ok(obj) | 返回 200 OK + JSON 序列化对象 | 查询成功、列表获取 |
| OkResult | Ok() | 仅返回 200 OK,无响应体 | 操作成功但无需返回数据 |
| JsonResult | Json(obj) | 强制 JSON 序列化,忽略内容协商 | 需要绕过 Accept 头强制返回 JSON |
| ContentResult | Content(str, type) | 原样输出字符串,指定 ContentType | 返回 XML、HTML、纯文本、CSV |
| ObjectResult | StatusCode(code, obj) | 自定义状态码 + 对象序列化 | 非标准状态码(如 418、429)带响应体 |
2. 资源创建与异步任务类
遵循 RESTful 规范,用于 POST 创建资源和异步处理反馈。
| 返回类型 | 便捷方法 | HTTP 状态码 | 核心作用 |
|---|
| CreatedResult | Created(uri, obj) | 201 | 手动指定新资源的 Location URL |
| CreatedAtActionResult | CreatedAtAction(action, route, obj) | 201 | 根据 Action 名自动生成 Location(最常用) |
| CreatedAtRouteResult | CreatedAtRoute(routeName, route, obj) | 201 | 根据路由名称生成 Location |
| AcceptedResult | Accepted(obj) | 202 | 请求已接收,异步处理中 |
| AcceptedAtActionResult | AcceptedAtAction(action, route, obj) | 202 | 异步处理中,附带状态查询地址 |
3. 客户端错误类
用于精确表达不同类型的客户端请求问题。
| 返回类型 | 便捷方法 | HTTP 状态码 | 语义区分 |
|---|
| BadRequestObjectResult | BadRequest(obj) | 400 | 请求语法/参数格式错误 |
| UnauthorizedResult | Unauthorized() | 401 | 未提供认证信息或凭据无效 |
| ForbidResult | Forbid() | 403 | 已认证但权限不足 |
| NotFoundObjectResult | NotFound(obj) | 404 | 请求的资源不存在 |
| ConflictObjectResult | Conflict(obj) | 409 | 资源状态冲突(如重复提交、并发修改) |
| UnprocessableEntityObjectResult | UnprocessableEntity(obj) | 422 | 语法正确但业务语义校验失败(模型验证) |
⚠️关键区分:400 是"你说错了"(格式问题),422 是"你说的对但办不到"(业务规则问题)。
4. 无内容响应类
| 返回类型 | 便捷方法 | HTTP 状态码 | 典型场景 |
|---|
| NoContentResult | NoContent() | 204 | PUT 更新成功、DELETE 删除成功 |
5. 文件下载类(FileResult 子类)
| 返回类型 | 便捷方法 | 数据来源 | 适用场景 |
|---|
| FileContentResult | File(byte[], type, name) | 内存字节数组 | 动态生成的小文件(验证码图片、导出 Excel) |
| FileStreamResult | File(stream, type, name) | Stream 流 | 大文件下载、OSS/云存储代理转发 |
| PhysicalFileResult | PhysicalFile(path, type, name) | 服务器物理路径 | 静态文件直接返回(需做路径安全校验) |
| VirtualFileResult | File(virtualPath, type) | wwwroot 虚拟路径 | 应用内静态资源返回 |
6. 重定向类
| 返回类型 | 便捷方法 | HTTP 状态码 | 安全特性 |
|---|
| RedirectResult | Redirect(url)/RedirectPermanent(url) | 302 / 301 | 支持外部 URL,需注意开放重定向风险 |
| RedirectToActionResult | RedirectToAction(action, controller) | 302 | 基于 Action 名称,编译时安全 |
| RedirectToRouteResult | RedirectToRoute(routeName, values) | 302 | 基于路由模板,解耦控制器依赖 |
| LocalRedirectResult | LocalRedirect(url) | 302 | ✅仅允许本地 URL,自动防御开放重定向攻击 |
7. 视图渲染类(传统 MVC)
| 返回类型 | 便捷方法 | 用途 |
|---|
| ViewResult | View(name, model) | 渲染完整 Razor 页面 |
| PartialViewResult | PartialView(name, model) | 渲染局部视图片段(HTMX/AJAX 局部刷新) |
💡 选型速查决策
需要返回什么? │ ├─ JSON 数据 ──────────► OkObjectResult / ActionResult<T> ├─ 原始文本/XML/HTML ──► ContentResult ├─ 创建资源成功 ───────► CreatedAtActionResult (201) ├─ 异步任务受理 ───────► AcceptedAtActionResult (202) ├─ 更新/删除成功 ──────► NoContentResult (204) ├─ 参数格式错误 ───────► BadRequestObjectResult (400) ├─ 业务校验失败 ───────► UnprocessableEntityObjectResult (422) ├─ 文件下载 ───────────► FileStreamResult (大文件) / FileContentResult (小文件) ├─ 页面跳转 ───────────► LocalRedirectResult (安全) / RedirectToActionResult └─ 自定义状态码 ───────► ObjectResult + StatusCode()
以上涵盖了 ASP.NET Core 中所有继承自ActionResult的常见返回类型。实际开发中,建议优先使用ActionResult<T>作为方法签名,内部根据业务分支返回上述具体类型,兼顾类型安全与灵活性。