ASP.NET MVC - 动作



ASP.NET MVC 动作方法负责执行请求并生成响应。默认情况下,它以 ActionResult 的形式生成响应。动作通常与用户交互具有一对一映射关系。

例如,在浏览器中输入 URL,点击任何特定链接以及提交表单等。每个用户交互都会导致向服务器发送请求。在每种情况下,请求的 URL 都包含 MVC 框架用于调用动作方法的信息。动作方法的唯一限制是它们必须是实例方法,因此不能是静态方法。此外,没有返回值限制。因此,您可以返回字符串、整数等。

请求处理

动作是 MVC 应用程序中最终的请求目标,它使用控制器基类。让我们来看一下请求处理。

  • 当一个 URL 到达时,例如 /Home/index,UrlRoutingModule 会检查并理解路由表中配置的内容知道如何处理该 URL。

Request Processing
  • 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** 时,您将收到以下输出作为动作。

Localhost Employee Mark Output

添加控制器

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

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

Add Another Controller

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

Add Scaffolding Dialog

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

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

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 Controller Output

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

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
广告