一、Controller 的运行过程
当浏览器发送请求时,ASP.NET MVC 依据路由规则定位到对应的控制器与动作。下面以一个典型的 MVC 项目为例说明。
打开项目的 Index.cshtml 页面:

页面展示如下:

地址栏中显示的 URL 为:http://localhost:61515/Home/Index
根据默认路由规则:{controller}/{action}/{id},Home 为控制器名称,Index 为动作名称。因此该 URL 实际调用的是 HomeController 控制器下的 Index 方法。

在 Index 方法中,仅有一行代码:return View();,代表返回一个视图。此时 ASP.NET MVC 会按照约定路径查找视图:
- 在
Views文件夹下定位与控制器同名的子目录(此处为Home) - 再找到与动作同名的视图文件(此处为
Index.cshtml)
因此最终返回给浏览器的是 Views/Home/Index.cshtml 页面。关于控制器返回视图的更多细节,后续章节会详细说明。
小提示: 若动作方法中不指定视图名称,框架将默认按“控制器名/动作名”路径自动查找。你也可以通过 return View("其他视图名"); 返回指定的视图。
控制器的整体运行流程可通过下图概括:

二、Controller 请求参数处理
实际开发中,我们经常在浏览器地址栏看到带参数的 URL,例如百度搜索:https://www.baidu.com/s?ie=UTF-8&wd=梦中的Aoede。在 MVC 中,如何获取这类参数呢?
假设我们为首页链接添加两个参数:http://localhost:61515/Home/Index?name=梦中的Aoede&age=18。
2.1 传统方式:Request.QueryString
在 Index 方法中,可以通过 Request.QueryString 获取参数:
public ActionResult Index()
{
var name = Request.QueryString["name"];
var age = Request.QueryString["age"];
return Content($"name:{name},age:{age}");
}
访问 http://localhost:61515/Home/Index?name=梦中的Aoede&age=18,显示结果如下:

2.2 更优方式:模型绑定(Model Binding)
实际上,MVC 内置的 模型绑定(Model Binding) 机制会自动从请求上下文(RequestContext)中提取参数,并自动映射到动作方法的参数上。因此只需在方法中直接声明参数即可:
public ActionResult Index(string name, int age)
{
return Content($"name:{name},age:{age}");
}
访问相同的 URL,输出结果完全一致:

小提示: 模型绑定支持多种数据源(查询字符串、表单数据、路由信息等),并会自动完成类型转换。例如这里的 age 声明为 int 类型,框架会将字符串 "18" 自动转换为整数。
2.3 处理 POST 表单
如果浏览器通过 POST 方式提交表单,同样可以借助模型绑定。只需在动作方法的参数中使用与表单字段对应的模型实体类即可。例如:
public ActionResult Submit(UserModel user)
{
// 直接使用 user 对象的属性
return Content($"姓名:{user.Name},年龄:{user.Age}");
}
常见问题: 如果参数名称与模型属性名称不一致怎么办?
答: 可以使用 [Bind(Prefix = "前缀")] 特性指定前缀,或者使用 [FromQuery(Name = "别名")] 等特性进行自定义绑定。
三、Controller 返回值说明
动作(Action)处理完请求后,需将结果返回给客户端。返回的结果称为 动作结果(Action Result)。
所有动作结果均继承自 ActionResult 基类。例如 View() 返回的是 ViewResult,而 ViewResult 正是 ActionResult 的子类。
3.1 六种标准动作结果
| 动作名称 | 概述 | 方法名 |
|---|---|---|
| ViewResult | 视图内容,HTML或标记 | View |
| EmptyResult | 空内容 | (无) |
| RedirectResult | 重定向到新的URL | Redirect |
| RedirectToRouteResult | 重定向到新的控制器 | RedirectToAction / RedirectToRoute |
| JsonResult | 返回JSON内容 | Json |
| ContentResult | 返回文本内容 | Content |
需要注意:虽然我们在代码中调用的是 Controller 基类中的方法(如 View()、Json()),但实际返回的是对应的动作结果对象。
3.2 非标准返回值
除了上述六种标准动作结果外,你还可以让动作方法返回其他任意类型的对象。框架会自动将该对象包装在 ContentResult 中返回。例如:
public class HomeController : Controller
{
public DateTime Index()
{
return DateTime.Now;
}
}
浏览器中显示的是一个日期字符串:

小提示: 虽然可以返回任意类型,但为了代码清晰和可维护性,建议尽量使用标准的动作结果类型,尤其是 ViewResult、JsonResult 和 ContentResult。
四、MVC 过滤器(Filters)简介
过滤器(Filters)是 ASP.NET MVC 中间向请求处理管道注入额外逻辑的机制。本文仅做简要介绍,更深入的内容将在后续文章中详解。
MVC 支持以下四种过滤器:
- 授权过滤器(Authorization):在动作执行前验证用户权限。
- 行为过滤器(Action):在动作执行前后执行自定义逻辑。
- 结果过滤器(Result):在结果返回前后执行自定义逻辑。
- 异常过滤器(Exception):处理动作过程中抛出的异常。
例如,如果需要某个方法只允许登录用户访问,可以在方法上方添加授权过滤器标记:
[Authorize]
public ActionResult Secret()
{
return View();
}
常见问题: 过滤器可以同时使用多个吗?执行顺序如何?
答: 可以。默认执行顺序为:授权过滤器 → 行为过滤器 → 动作方法 → 结果过滤器 → 异常过滤器(仅在发生异常时触发)。你可以通过 [FilterOrder] 特性改变顺序。
五、总结
通过本教程,你应该掌握了以下核心概念:
- 控制器的运行过程:从浏览器请求到动作方法执行,再到视图返回。
- 请求参数处理:利用模型绑定简化参数获取,支持 GET/POST 等多种方式。
- 返回值类型:六种标准动作结果以及任意类型返回值的处理。
- 过滤器:在请求管道中插入逻辑的机制,如授权、异常处理等。
这些知识是 ASP.NET MVC 开发的基础,掌握它们将帮助你更高效地构建 Web 应用。更多进阶内容(如路由定制、依赖注入、自定义过滤器等)敬请关注后续文章。
