ASP.NET Core – 操作结果
ASP.NET Core – 操作结果
在本章中,我们将讨论操作结果。在前面的章节中,我们一直使用简单的 C# 类作为控制器。这些类不是从基类派生的,您可以将此方法用于 MVC,但从 Microsoft.AspNet.Mvc 命名空间中提供的控制器基类派生控制器更为常见。
-
这个基类让我们可以访问很多关于请求的上下文信息,以及帮助我们构建结果发送回客户端的方法。
-
您可以在响应中发回简单的字符串和整数。您还可以发回复杂对象,例如代表学生、大学或餐厅等的对象,以及与该对象关联的所有数据。
-
这些结果通常被封装到一个实现 IActionResult 接口的对象中。
-
有许多不同的结果类型实现了这个接口——结果类型可以包含模型或下载文件的内容。
-
这些不同的结果类型可以让我们将 JSON 发送回客户端或 XML 或构建 HTML 的视图。
动作基本上返回不同类型的动作结果。ActionResult 类是所有操作结果的基础。以下是不同类型的操作结果及其行为的列表。
Name | 行为 |
---|---|
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类并在浏览器中运行应用程序。它将产生以下页面。
您现在可以看到与我们之前的响应没有任何不同的响应。它仍然只是一个纯文本响应。
-
您可能想知道使用产生ActionResult 的东西有什么好处。
-
典型的优点是它只是一种封装控制器决策的正式方式。
-
控制器决定下一步做什么,要么返回一个字符串或 HTML,要么返回一个可能被序列化为 JSON 等的模型对象。
-
控制器需要做的就是做出决定,控制器不必将其决定的结果直接写入响应。
-
它只需要返回决定,然后框架将获取结果并了解如何将该结果转换为可以通过 HTTP 发回的内容。
示例 2
让我们再举一个例子。在项目中创建一个新文件夹并将其命名为Models。在 Models 文件夹中,我们要添加一个可以表示 Employee 的类。
如上图所示,在 Name 字段中输入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 action 方法中,我们想要返回一个 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 响应。
保存所有文件并刷新浏览器。您将看到以下输出。