ASP.NET Core - 行动结果


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

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

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

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

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

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

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

姓名 Behave
内容结果 返回一个字符串
文件内容结果 返回文件内容
文件路径结果 返回文件内容
文件流结果 返回文件内容。
空结果 不返回任何内容
JavaScript结果 返回执行脚本
Json结果 返回 JSON 格式的数据
重定向到结果 重定向到指定的 URL
Http未授权结果 返回 403 HTTP 状态代码
重定向到路由结果 重定向到不同的操作/不同的控制器操作
查看结果 作为视图引擎的响应收到
部分查看结果 作为视图引擎的响应收到

实施例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类并在浏览器中运行该应用程序。它将产生以下页面。

行动 结果

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

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

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

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

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

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

实施例2

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

楷模

在名称字段中输入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 并向其中传递一些模型对象。

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

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

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

马克·厄普斯顿