ASP.NET Core - Action 操作结果

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

  • 这个基类使我们能够访问有关请求的大量上下文信息,以及帮助我们构建结果以发送回客户端的方法。

  • 您可以在响应中发回简单的字符串和整数。 您还可以发回复杂对象,例如代表学生、大学或餐馆等的对象,以及与该对象关联的所有数据。

  • 这些结果通常被封装到一个实现了 IActionResult 接口的对象中。

  • 有许多不同的结果类型实现了这个接口——结果类型可以包含模型或供下载的文件内容。

  • 这些不同的结果类型可以让我们将 JSON 发送回客户端或 XML 或构建 HTML 的视图。

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

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

示例 1

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

using Microsoft.AspNet.Mvc; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks;  

namespace FirstAppdemo.Controllers  { 
   public class HomeController : Controller { 
      public ContentResult Index() { 
         return Content("Hello, World! this message is from 
            Home Controller using the Action Result"); 
      } 
   } 
}

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

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

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

Action Result

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

  • 您可能想知道使用生成 ActionResult 有什么好处。

  • 典型的优点是它只是一种形式化的方式来封装控制器的决定。

  • 控制器决定下一步做什么,要么返回一个字符串或 HTML,要么返回一个可能被序列化为 JSON 等的模型对象。

  • 控制器需要做的就是做出决定,控制器不必将其决定结果直接写入响应。

  • 它只需要返回决定,然后框架将获取结果并了解如何将该结果转换为可以通过 HTTP 发回的内容。


示例 2

再举个例子。 在项目中创建一个新文件夹并将其命名为 Models。 在 Models 文件夹中,我们要添加一个可以代表 Employee 的类。

Models

如上图所示,在名称字段中输入 Employee.cs。 在这里,Employee 类的实现包含两个属性。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks;  

namespace FirstAppDemo.Models { 
   public class Employee { 
      public int ID { get; set; } 
      public string Name { get; set} 
   } 
}

HomeController 的 Index 操作方法中,我们想要返回一个 Employee 对象。 下面是 HomeController 的实现。

using FirstAppDemo.Models; 
using Microsoft.AspNet.Mvc; 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks;  

namespace FirstAppdemo.Controllers { 
   public class HomeController : Controller { 
      public ObjectResult Index() { 
         var employee = new Employee { ID = 1, Name = "Mark Upston"}; 
         return new ObjectResult(employee); 
      } 
   } 
} 

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

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

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

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

Mark Upston