ASP.NET MVC – 控制器

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 个就够用一辈子)

返回类型写法典型场景
ViewResultreturn View(model);返回普通页面(最常用)
PartialViewResultreturn PartialView("_Item", model);局部视图(Ajax、组件)
RedirectResultreturn Redirect("/Home/Index");跳转到其他页面
RedirectToRouteResultreturn RedirectToAction("Index","Home");跳转到其他 Action(推荐)
JsonResultreturn Json(data, JsonRequestBehavior.AllowGet);返回 JSON(Ajax 接口)
ContentResultreturn Content("成功", "text/plain");返回纯文本、XML、HTML 片段
HttpNotFoundResultreturn 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 格式)
  • 前台常用控制器示例

直接复制粘贴就能用,省一个星期开发时间,随时说一声就发!

文章已创建 2965

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部