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 时,您将收到以下输出作为操作。

Localhost Employee 标记输出

添加控制器

让我们添加另一个控制器。

步骤 1 − 右键单击 Controllers 文件夹并选择 Add → Controller。

添加另一个控制器

它将显示“添加控制器”对话框。

添加控制器对话框

步骤 2 − 选择 MVC 5 Controller – Empty 选项并单击"Add"按钮。

将出现"添加控制器"对话框。

CustomerController

步骤 3 − 将名称设置为 CustomerController 并单击"添加"按钮。

现在您将在 Controllers 文件夹中看到一个新的 C# 文件"CustomerController.cs",该文件也可在 Visual Studio 中打开以供编辑。

set_name CustomerController

同样,再添加一个名为 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 − 运行此应用程序,您将收到以下输出。

Home 控制器输出

步骤 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。 您将看到以下输出。

Localhost 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

Localhost Customers GetAllCustomers