ASP.NET MVC 中的 Controller(控制器) 是整个框架的“大脑”,负责接收请求、处理业务逻辑、调用模型、最终决定返回什么给用户。
下面给你一份最全、最实用的控制器使用大全(基于 ASP.NET MVC 5 + .NET Framework,2025 年依然是企业主流)
一、控制器基础结构(90% 控制器都长这样)
using System.Web.Mvc;
namespace MvcDemo.Controllers
{
// 访问地址:/Product 或 /Product/Index
public class ProductController : Controller // 必须继承 Controller
{
// GET: /Product/Index
public ActionResult Index()
{
var list = db.Products.Where(p => p.IsActive).ToList();
return View(list); // 返回视图 + 数据
}
// GET: /Product/Details/5
public ActionResult Details(int id = 0)
{
var product = db.Products.Find(id);
if (product == null) return HttpNotFound();
return View(product);
}
}
}
二、控制器能返回的 7 种主要结果(记住这 7 个就够用一辈子)
| 返回类型 | 写法 | 典型场景 |
|---|---|---|
| ViewResult | return View(model); | 返回普通页面(最常用) |
| PartialViewResult | return PartialView("_Item", model); | 局部视图(Ajax、组件) |
| RedirectResult | return Redirect("/Home/Index"); | 跳转到其他页面 |
| RedirectToRouteResult | return RedirectToAction("Index","Home"); | 跳转到其他 Action(推荐) |
| JsonResult | return Json(data, JsonRequestBehavior.AllowGet); | 返回 JSON(Ajax 接口) |
| ContentResult | return Content("成功", "text/plain"); | 返回纯文本、XML、HTML 片段 |
| HttpNotFoundResult | return HttpNotFound(); | 404 页面 |
三、Action 的 4 种常见限制方式(必须记住)
[HttpGet] // 只允许 GET(默认就是)
[HttpPost] // 只允许 POST
[ValidateAntiForgeryToken] // 防止跨站请求伪造(配合 @Html.AntiForgeryToken())
[Authorize] // 必须登录才能访问
[Authorize(Roles = "Admin")] // 只有管理员能进
public class AdminController : Controller
{
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Delete(int id)
{
// 删除逻辑
return RedirectToAction("Index");
}
}
四、控制器里最常用的 8 个内置对象
| 属性/方法 | 说明 | 常见用法 |
|---|---|---|
Request | 获取用户请求信息 | Request.QueryString[“key”] |
Response | 向浏览器写内容 | Response.Write(“hello”) |
Session | 会话存储(默认 20 分钟) | Session[“UserId”] = 123; |
TempData | 跳转后只保留一次的数据(推荐用于提示) | TempData[“Msg”] = “删除成功”; |
ViewBag | 动态传值到视图(本请求有效) | ViewBag.Title = “商品列表”; |
ViewData | 同上,但类型安全差 | 不推荐 |
User | 当前登录用户信息(配合 [Authorize]) | User.Identity.Name |
Url | 生成 URL 工具 | Url.Action(“Edit”,”Product”,new{id=5}) |
五、控制器最佳实践(企业级规范)
public class ProductController : Controller
{
private readonly IProductService _service; // 依赖注入(推荐)
public ProductController(IProductService service)
{
_service = service;
}
public ActionResult Index(string keyword = "", int page = 1)
{
var model = _service.GetList(keyword, page);
return View(model);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Product model)
{
if (!ModelState.IsValid)
return View(model); // 验证失败返回原页面
_service.Add(model);
TempData["Success"] = "添加成功!";
return RedirectToAction("Index");
}
}
六、控制器命名与路由约定(严格遵守,省 90% 配置)
| 控制器类名 | 默认访问地址 |
|---|---|
| HomeController | / 或 /Home/Index |
| ProductController | /Product |
| Admin/UserController | /Admin/User |
| Api/ProductApiController | /api/ProductApi(WebAPI 风格) |
七、控制器进阶技巧(实际项目必备)
| 需求 | 解决方案 |
|---|---|
| 全局异常处理 | 继承 HandleErrorAttribute 或写自定义 Filter |
| 防止重复提交 | [HttpPost] + TempData 标记 |
| 统一返回 JSON 格式 | 自定义 JsonResult + Filter |
| 移动端和 PC 自动切换视图 | 重写 Controller.View() 判断 UserAgent |
| 多语言站点 | 在 BaseController 中设置 Thread.CurrentThread.CurrentUICulture |
八、推荐的控制器基类(所有项目都建议建一个)
public class BaseController : Controller
{
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
// 所有控制器执行前都会经过这里
if (User.Identity.IsAuthenticated)
ViewBag.UserName = User.Identity.Name;
base.OnActionExecuting(filterContext);
}
protected override void OnException(ExceptionContext filterContext)
{
// 统一异常处理
filterContext.Result = new ViewResult
{
ViewName = "~/Views/Shared/Error.cshtml"
};
filterContext.ExceptionHandled = true;
}
}
然后所有控制器继承它:
public class ProductController : BaseController
{
// 自动拥有登录判断、异常处理等功能
}
掌握上面内容,你写的控制器就已经达到企业级水平了。
需要我直接发你一个「完整控制器模板包」吗?包含:
- BaseController(登录判断、日志、异常统一处理)
- Admin 后台所有常用控制器模板(带权限)
- API 控制器模板(返回统一 JSON 格式)
- 前台常用控制器示例
直接复制粘贴就能用,省一个星期开发时间,随时说一声就发!