ASP.NET Core Action Result

在本章中,我们将讨论 Action Result。在前面的章节中,我们一直使用简单的 C# 类作为控制器。这些类不是从基类派生的,您可以在 MVC 中使用这种方法,但更常见的是从 Microsoft.AspNet.MVC 命名空间中提供的控制器基类派生控制器。

  • 这个基类使我们能够访问关于请求的大量上下文信息,以及帮助我们构建结果以发送回客户端的方法。
  • 您可以在响应中发回简单的字符串和整数。您还可以发回复杂的对象,如表示学生、大学或餐厅等的对象以及与该对象相关的所有数据。
  • 这些结果通常封装到实现 IActionResult 接口的对象中。
  • 有许多不同的结果类型实现了这个接口——结果类型可以包含模型或下载文件的内容。
  • 这些不同的结果类型让我们可以将 JSON 发送回客户端、XML 或构建 HTML 的视图。

Action 基本上返回不同类型的操作结果。ActionResult 类是所有操作结果的基础。以下是不同类型的操作结果及其行为的列表。

名称行为
ContentResult返回一个字符串
FileContentResult返回文件内容
FilePathResult返回文件内容
FileStreamResult返回文件内容
EmptyResult返回空
JavaScriptResult返回要执行的脚本
JsonResult返回 JSON 格式的数据
RedirectToResult跳转到指定 URL
HttpUnauthorizedResult返回 403 状态码
RedirectToRouteResult重定向至不同操作/不同控制器操作
ViewResult作为视图引擎的响应接收
PartialViewResult作为视图引擎的响应接收

实例 1

让我们通过打开 HomeController 类并从基于控制器的类派生它来执行一个简单的示例。此基类位于 Microsoft.AspNet.Mvc 命名空间中。以下是 HomeController 类的实现。

  1. using Microsoft.AspNetCore.Mvc;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Threading.Tasks;
  6. namespace MyFirstCoreWebApp.Controllers
  7. {
  8. public class HomeController:Controller
  9. {
  10. public ContentResult Index()
  11. {
  12. return Content("Hello, World! this message is from Home Controller using the Action Result");
  13. }
  14. }
  15. }

现在您可以看到,索引方法正在返回 ContentResult,这是结果类型之一,所有这些结果类型最终都实现了一个接口,即 ActionResult

Index 方法中,我们向 Content 方法传递了一个字符串。此 Content 方法生成 ContentResult;这意味着 Index 方法现在将返回 ContentResult

让我们保存 HomeController 类并在浏览器中运行应用程序。它将生成以下页面。

您现在可以看到一个与我们之前的响应看起来没有任何不同的响应。它仍然只是一个简单的文本回应。

  • 您可能想知道使用生成 ActionResult 的东西有什么好处。
  • 典型的优点是,它只是封装控制器决策的一种正式方式。
  • 控制器决定下一步要做什么,要么返回字符串或HTML,要么返回可能被序列化为 JSON 等的模型对象。
  • 控制器所需要做的就是做出该决策,并且控制器不必将其决策的结果直接写入响应中。
  • 它只需要返回决策,然后框架就会得到结果,并了解如何将结果转换为可以通过 HTTP 发送回的内容。

实例 2

让我们再举一个例子。在项目中创建一个新文件夹,并将其称为模型。在 Models 文件夹中,我们希望添加一个可以表示 Employee(雇员)的类。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. namespace MyFirstCoreWebApp.Models
  6. {
  7. public class Employee
  8. {
  9. public int ID { get; set; }
  10. public string Name { get; set; }
  11. }
  12. }

HomeControllerIndex 操作方法中,我们希望返回一个 Employee 对象。以下是 HomeController 的实现。

  1. using Microsoft.AspNetCore.Mvc;
  2. using MyFirstCoreWebApp.Models;
  3. namespace MyFirstCoreWebApp.Controllers
  4. {
  5. public class HomeController : Controller
  6. {
  7. public ObjectResult Index()
  8. {
  9. var employee = new Employee { ID = 1, Name = "Mark Upston" };
  10. return new ObjectResult(employee);
  11. }
  12. }
  13. }

现在,我们将返回一种不同类型的结果,即 ObjectResult,而不是返回 Content。如果我们想要 ObjectResult,我们需要创建或实例化一个 ObjectResult 并将一些模型对象传递给它。

ObjectResult 在 MVC 框架中很特殊,因为当我们返回 ObjectResult 时,MVC 框架会查看这个对象。此对象需要在 HTTP 响应中表示。

该对象应序列化为 XML 或 JSON 或其他格式,最终将根据启动时提供给 MVC 的配置信息做出决定。如果不配置任何内容,只会得到一些默认值,默认值是 JSON 响应。

保存所有文件并刷新浏览器。您将看到以下输出。