ASP.NET MVC - 操作
ASP.NET MVC 操作方法负责执行请求并生成响应。 默认情况下,它会生成 ActionResult 形式的响应。 操作通常与用户交互具有一对一的映射。
例如,在浏览器中输入 URL、单击任何特定链接并提交表单等。这些用户交互中的每一个都会导致将请求发送到服务器。 在每种情况下,请求的 URL 都包含 MVC 框架用于调用操作方法的信息。 对操作方法的一个限制是它们必须是实例方法,因此它们不能是静态方法。 而且没有返回值限制。 所以可以返回字符串、整数等。
请求处理
Actions 是 MVC 应用程序中的最终请求目的地,它使用控制器基类。 让我们看一下请求处理。
当 URL 到达时,例如 /Home/index,UrlRoutingModule 会检查并了解路由表中配置的内容是否知道如何处理该 URL。
UrlRoutingModule 将我们在路由表中配置的信息放在一起,并将控制权移交给 MVC 路由处理程序。
MVC 路由处理程序将控制器传递给 MvcHandler,它是一个 HTTP 处理程序。
MvcHandler 使用控制器工厂来实例化控制器,并且它知道要实例化哪个控制器,因为它在 RouteData 中查找该控制器值。
一旦 MvcHandler 有了控制器,MvcHandler 唯一知道的就是 IController 接口,因此它只是告诉控制器执行。
当它告诉控制器执行时,它是从 MVC 的控制器基类派生的。 Execute 方法创建一个操作调用程序,并告诉该操作调用程序去查找要调用的方法,找到要调用的操作。
操作调用程序再次查看 RouteData 并找到从路由引擎传递的操作参数。
操作类型
操作基本上返回不同类型的操作结果。 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 http://localhost:61465/Employee/Mark 时,您将收到以下输出作为操作。
添加控制器
让我们添加另一个控制器。
步骤 1 − 右键单击 Controllers 文件夹并选择 Add → Controller。
它将显示“添加控制器”对话框。
步骤 2 − 选择 MVC 5 Controller – Empty 选项并单击"Add"按钮。
将出现"添加控制器"对话框。
步骤 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 − 运行此应用程序并请求 http://localhost: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