ASP.NET Core - 操作结果



在本章中,我们将讨论操作结果。在前面的章节中,我们一直在使用简单的 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); 
      } 
   } 
} 

现在,我们不再返回 Content,而是返回一种称为 **ObjectResult** 的不同类型的结果。如果我们想要 ObjectResult,我们需要创建一个或实例化一个 ObjectResult 并向其中传递一些 **model** 对象。

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

  • 此对象应序列化为 XML 或 JSON 或其他某种格式,最终,决策将基于你在启动时提供给 MVC 的配置信息做出。如果你没有配置任何内容,你只会获得一些默认值,默认值是 JSON 响应。

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

Mark Upston
广告