
- ASP.NET MVC 教程
- ASP.NET MVC - 首页
- ASP.NET MVC - 概述
- ASP.NET MVC - 模式
- ASP.NET MVC - 环境设置
- ASP.NET MVC - 入门
- ASP.NET MVC - 生命周期
- ASP.NET MVC - 路由
- ASP.NET MVC - 控制器
- ASP.NET MVC - 动作
- ASP.NET MVC - 过滤器
- ASP.NET MVC - 选择器
- ASP.NET MVC - 视图
- ASP.NET MVC - 数据模型
- ASP.NET MVC - 辅助程序
- ASP.NET MVC - 模型绑定
- ASP.NET MVC - 数据库
- ASP.NET MVC - 验证
- ASP.NET MVC - 安全性
- ASP.NET MVC - 缓存
- ASP.NET MVC - Razor
- ASP.NET MVC - 数据注解
- Nuget 包管理
- ASP.NET MVC - Web API
- ASP.NET MVC - 脚手架
- ASP.NET MVC - Bootstrap
- ASP.NET MVC - 单元测试
- ASP.NET MVC - 部署
- ASP.NET MVC - 自托管
- ASP.NET MVC 有用资源
- ASP.NET MVC - 快速指南
- ASP.NET MVC - 有用资源
- ASP.NET MVC - 讨论
ASP.NET MVC - 动作
ASP.NET MVC 动作方法负责执行请求并生成响应。默认情况下,它以 ActionResult 的形式生成响应。动作通常与用户交互具有一对一映射关系。
例如,在浏览器中输入 URL,点击任何特定链接以及提交表单等。每个用户交互都会导致向服务器发送请求。在每种情况下,请求的 URL 都包含 MVC 框架用于调用动作方法的信息。动作方法的唯一限制是它们必须是实例方法,因此不能是静态方法。此外,没有返回值限制。因此,您可以返回字符串、整数等。
请求处理
动作是 MVC 应用程序中最终的请求目标,它使用控制器基类。让我们来看一下请求处理。
当一个 URL 到达时,例如 /Home/index,UrlRoutingModule 会检查并理解路由表中配置的内容知道如何处理该 URL。

UrlRoutingModule 将我们在路由表中配置的信息组合在一起,并将控制权交给 MVC 路由处理程序。
MVC 路由处理程序将控制器交给 MvcHandler,它是一个 HTTP 处理程序。
MvcHandler 使用控制器工厂来实例化控制器,它知道要实例化哪个控制器,因为它在 RouteData 中查找该控制器值。
一旦 MvcHandler 有了一个控制器,MvcHandler 只知道 IController 接口,因此它只是告诉控制器执行。
当它告诉控制器执行时,它已经从 MVC 的控制器基类派生。Execute 方法创建一个动作调用器,并告诉该动作调用器去查找要调用的方法,查找要调用的动作。
动作调用器再次查看 RouteData 并找到从路由引擎传递过来的 action 参数。
动作类型
动作基本上返回不同类型的操作结果。ActionResult 类是所有操作结果的基类。以下是不同类型的操作结果及其行为的列表。
序号 | 名称和行为 |
---|---|
1 | ContentResult 返回一个字符串 |
2 | FileContentResult 返回文件内容 |
3 | FilePathResult 返回文件内容 |
4 | FileStreamResult 返回文件内容 |
5 | EmptyResult 不返回任何内容 |
6 | JavaScriptResult 返回要执行的脚本 |
7 | JsonResult 返回 JSON 格式的数据 |
8 | RedirectToResult 重定向到指定的 URL |
9 | HttpUnauthorizedResult 返回 403 HTTP 状态代码 |
10 | RedirectToRouteResult 重定向到不同的动作/不同的控制器动作 |
11 | ViewResult 作为视图引擎的响应接收 |
12 | PartialViewResult 作为视图引擎的响应接收 |
让我们来看一下上一章中我们创建的 EmployeeController 的一个简单示例。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVCControllerDemo.Controllers { public class EmployeeController : Controller{ // GET: Employee public ActionResult Search(string name){ var input = Server.HtmlEncode(name); return Content(input); } } }
当您请求以下 URL **https://127.0.0.1:61465/Employee/Mark** 时,您将收到以下输出作为动作。

添加控制器
让我们再添加一个控制器。
**步骤 1** - 右键单击 Controllers 文件夹,然后选择添加 -> 控制器。

它将显示“添加脚手架”对话框。

**步骤 2** - 选择 MVC 5 控制器 - 空选项,然后单击“添加”按钮。
将出现“添加控制器”对话框。

**步骤 3** - 将名称设置为 CustomerController 并单击“添加”按钮。
现在,您将在 Controllers 文件夹中看到一个新的 C# 文件“CustomerController.cs”,它也可以在 Visual Studio 中打开进行编辑。

同样,添加另一个名为 HomeController 的控制器。以下是 HomeController.cs 类的实现。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVCControllerDemo.Controllers { public class HomeController : Controller{ // GET: Home public string Index(){ return "This is Home Controller"; } } }
**步骤 4** - 运行此应用程序,您将收到以下输出。

**步骤 5** - 在我们上面创建的 Customer 控制器中添加以下代码。
public string GetAllCustomers(){ return @"<ul> <li>Ali Raza</li> <li>Mark Upston</li> <li>Allan Bommer</li> <li>Greg Jerry</li> </ul>"; }
**步骤 6** - 运行此应用程序并请求 **https://127.0.0.1:61465/Customer/GetAllCustomers**。您将看到以下输出。

您还可以重定向到同一控制器的操作,甚至重定向到不同控制器的操作。
以下是一个简单的示例,我们将使用以下代码更改 HomeController 中的代码,从 HomeController 重定向到 Customer Controller。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MVCControllerDemo.Controllers{ public class HomeController : Controller{ // GET: Home public ActionResult Index(){ return RedirectToAction("GetAllCustomers","Customer"); } } }
如您所见,我们使用了 RedirectToAction() 方法 ActionResult,它有两个参数,操作名称和控制器名称。
运行此应用程序后,您将看到默认路由会将其重定向到 /Customer/GetAllCustomers
