目录
-
- [引言:Controller------ 你的 "请求服务员"](#引言:Controller—— 你的 “请求服务员”)
- [一、MVC 5 中的 Controller:"全能型服务员"](#一、MVC 5 中的 Controller:“全能型服务员”)
-
- [1.1 类定义:继承自Controller](#1.1 类定义:继承自Controller)
- [1.2 Controller类的 "超能力"](#1.2 Controller类的 “超能力”)
- 小结
- [二、ASP.NET Core 中的 ControllerBase:"精简型专员"](#二、ASP.NET Core 中的 ControllerBase:“精简型专员”)
-
- [2.1 类定义:继承自ControllerBase](#2.1 类定义:继承自ControllerBase)
- [2.2 ControllerBase的 "核心技能"](#2.2 ControllerBase的 “核心技能”)
- [2.3 特殊情况:Core 中的Controller类](#2.3 特殊情况:Core 中的Controller类)
- 小结
- [三、Controller(MVC 5)与ControllerBase(Core)核心区别](#三、Controller(MVC 5)与ControllerBase(Core)核心区别)
- [四、请求处理流程图:Controller 的工作流程](#四、请求处理流程图:Controller 的工作流程)
- 五、常踩的坑及避坑指南
-
- [坑 1:Core 中用ControllerBase却忘了加[ApiController]特性](#坑 1:Core 中用ControllerBase却忘了加[ApiController]特性)
- [坑 2:MVC 5 中混淆Controller和ApiController](#坑 2:MVC 5 中混淆Controller和ApiController)
- [坑 3:Core 中滥用Controller代替ControllerBase](#坑 3:Core 中滥用Controller代替ControllerBase)
- [坑 4:依赖注入时忘了注册控制器](#坑 4:依赖注入时忘了注册控制器)
- 小结
- 六、互动环节
引言:Controller------ 你的 "请求服务员"
在ASP.NET的世界里,Controller 就像餐厅里的服务员:用户(客户端)点餐(发送请求),服务员(Controller)记录需求、告诉厨房(业务层)做什么,最后把菜(响应)端给用户。而 Controller 的 "身份",就藏在它继承的类里 ------MVC 5 里的Controller和ASP.NET Core 里的ControllerBase,看似只差几个字,实际用法却大相径庭。
今天这篇文章,我们就扒开这两个类的真面目,用代码说话,聊聊它们的区别、踩坑点,再用生活例子帮你吃透核心逻辑。

一、MVC 5 中的 Controller:"全能型服务员"
1.1 类定义:继承自Controller
在 MVC 5 中,控制器类必须继承System.Web.Mvc.Controller。这个类就像一个 "全能服务员",不仅能处理数据请求,还自带 "端盘子(渲染视图)" 的技能。
csharp
// MVC 5控制器示例
using System.Web.Mvc;
namespace Mvc5Demo.Controllers
{
// 继承自System.Web.Mvc.Controller
public class HomeController : Controller
{
// 处理GET请求:访问首页
public ActionResult Index()
{
// 自带View()方法,用于返回视图页面
return View();
}
// 处理表单提交(POST请求)
[HttpPost]
public ActionResult Submit(string name)
{
if (string.IsNullOrEmpty(name))
{
// 自带ModelState验证和ViewBag传值
ModelState.AddModelError("", "姓名不能为空");
return View("Index"); // 返回指定视图
}
// 重定向到成功页面
return RedirectToAction("Success");
}
public ActionResult Success()
{
return View();
}
}
}
1.2 Controller类的 "超能力"
Controller类之所以 "全能",是因为它内置了很多实用工具(这些都是ControllerBase在 Core 中需要手动配置的):
- 视图相关: View()、PartialView()(返回视图)、RedirectToAction()(重定向);
- 数据传递: ViewBag、ViewData(在控制器和视图间传值);
- 模型验证: ModelState(自动处理表单验证);
- 会话管理: Session、TempData(存储会话数据)。
小结
MVC 5 的Controller是 "全能型选手",适合需要返回 HTML 页面的传统 Web 应用,像一个既能点餐又能端盘的服务员,一条龙服务到底。
二、ASP.NET Core 中的 ControllerBase:"精简型专员"
ASP.NET Core 对 MVC 和 Web API 进行了合并,控制器的基类也变得更灵活。其中ControllerBase是 "精简版基类",专注于处理数据请求(比如 API 接口),就像餐厅里只负责记录订单、不参与端盘的 "点餐专员"。
2.1 类定义:继承自ControllerBase
csharp
// ASP.NET Core API控制器示例
using Microsoft.AspNetCore.Mvc;
namespace CoreDemo.Controllers
{
// 必须添加[ApiController]特性(Core 2.1+),增强API功能
[ApiController]
[Route("api/[controller]")] // 路由模板:api/Users
public class UsersController : ControllerBase
{
// 处理GET请求:获取用户列表
[HttpGet]
public IActionResult GetList()
{
var users = new List<string> { "张三", "李四" };
// 返回JSON数据(Core自动序列化)
return Ok(users);
}
// 处理POST请求:新增用户
[HttpPost]
public IActionResult Add([FromBody] string userName)
{
if (string.IsNullOrEmpty(userName))
{
// 返回400错误(BadRequest)
return BadRequest("用户名不能为空");
}
// 返回201状态(Created)
return CreatedAtAction(nameof(GetList), new { id = 1 }, userName);
}
}
}
2.2 ControllerBase的 "核心技能"
ControllerBase只保留了处理请求的核心功能,去掉了视图相关的 "冗余",适合 API 开发:
- 状态码返回:Ok()(200)、BadRequest()(400)、NotFound()(404)等(对应 HTTP 状态码);
- 模型验证:ModelState(但需要[ApiController]特性自动触发);
- 路由与参数绑定:配合[Route]、[FromQuery]、[FromBody]等特性使用。
2.3 特殊情况:Core 中的Controller类
Core 中也有一个Controller类,但它是ControllerBase的 "升级版"------ 继承自ControllerBase,并添加了视图相关方法(View()等)。如果你的 Core 项目既需要 API 又需要 HTML 视图,可以用它:
csharp
// Core中同时支持视图和API的控制器
public class HomeController : Controller // 继承自Controller(间接继承ControllerBase)
{
public IActionResult Index()
{
return View(); // 支持视图
}
[HttpGet("api/data")]
public IActionResult GetData()
{
return Ok("这是API数据"); // 支持API返回
}
}
小结
Core 的ControllerBase是 "精简专员",适合纯 API 开发;而 Core 的Controller是 "增强版专员",兼顾 API 和视图,按需选择即可。
三、Controller(MVC 5)与ControllerBase(Core)核心区别
| 对比项 | MVC 5 的Controller | Core 的ControllerBase |
|---|---|---|
| 命名空间 | System.Web.Mvc | Microsoft.AspNetCore.Mvc |
| 视图支持 | 内置View()等方法,原生支持视图 | 无视图方法,需继承Controller才支持 |
| 特性依赖 | 无需额外特性 | 需[ApiController]增强 API 功能 |
| 数据传递 | 自带ViewBag、ViewData | 无,API 通常用Ok()返回序列化数据 |
| 适用场景 | 传统 Web 应用(返回 HTML) | 纯 API 服务(返回 JSON/XML) |
| 继承关系 | 直接使用 | Core 的Controller继承自它 |
四、请求处理流程图:Controller 的工作流程
客户端发起请求
(GET/POST等) 路由系统
匹配目标控制器+Action 控制器实例化
(自动触发依赖注入) Action方法执行
├─ 参数绑定(FromQuery/FromBody等)
└─ 模型验证(ModelState) 调用业务逻辑层
(处理核心业务:查库/计算等) 返回响应结果
├─ MVC 5:视图(View)/ 重定向
└─ Core:JSON/XML/HTTP状态码 客户端接收响应
(渲染页面/解析数据)
解释: 就像你去餐厅:
1.你说 "我要一份汉堡"(请求);
2.服务员问清你点的是 "哪个柜台的汉堡"(路由匹配);
3.服务员记下来(控制器实例化);
4.检查你有没有说清楚要加什么(模型验证);
5.告诉厨房做(调用业务逻辑);
6.把汉堡给你(返回响应)。
五、常踩的坑及避坑指南
坑 1:Core 中用ControllerBase却忘了加[ApiController]特性
症状: 模型验证失败时,不会自动返回 400 错误,需要手动判断ModelState.IsValid。
错误代码:
csharp
// 忘记加[ApiController]
public class UsersController : ControllerBase
{
[HttpPost]
public IActionResult Add(string name)
{
// 必须手动判断,否则无效数据会继续执行
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
return Ok();
}
}
解决: 加上[ApiController]特性,Core 会自动验证并返回 400:
csharp
[ApiController] // 加上这个!
public class UsersController : ControllerBase { ... }
坑 2:MVC 5 中混淆Controller和ApiController
症状: 在 MVC 5 中开发 API 时,错误继承Controller而非ApiController(MVC 5 单独有ApiController),导致返回格式混乱。
解决: MVC 5 开发 API 应继承ApiController(命名空间System.Web.Http):
csharp
using System.Web.Http;
public class ApiUsersController : ApiController
{
public IHttpActionResult Get()
{
return Ok("API数据"); // 自动返回JSON
}
}
坑 3:Core 中滥用Controller代替ControllerBase
症状: 纯 API 项目中继承Controller,导致引入不必要的视图相关功能(冗余),甚至路由冲突。
解决: 纯 API 用ControllerBase,需要视图才用Controller:
csharp
// 纯API项目推荐
public class ApiController : ControllerBase { ... }
坑 4:依赖注入时忘了注册控制器
症状: Core 中控制器构造函数有参数,但未在Program.cs注册服务,运行时报 "无法解析服务" 错误。
错误代码:
csharp
public class UsersController : ControllerBase
{
private readonly IUserService _userService;
// 依赖IUserService
public UsersController(IUserService userService)
{
_userService = userService;
}
}
解决: 在Program.cs注册服务:
csharp
builder.Services.AddScoped<IUserService, UserService>(); // 注册服务
小结
踩坑不可怕,关键是记住:Core 中 API 加[ApiController]、纯 API 用ControllerBase、依赖服务要注册,MVC 5 的 API 别选错基类。
六、互动环节
看完这篇文章,你对 Controller 的继承是不是更清晰了?
欢迎在评论区分享你的踩坑经历,或者提问关于 Controller 的其他问题,我们一起讨论!
结语: Controller 是请求处理的 "前线指挥官",选对基类就像选对工具 ------ 用对了事半功倍,用错了处处碰壁。希望这篇文章能帮你理清思路,少走弯路~