在本章中,我们将讨论行动结果.在前面的章节中,我们一直使用简单的C#类作为控制器.这些类不是从基类派生的,您可以将此方法与MVC一起使用,但从Microsoft.AspNet.Mvc命名空间中提供的控制器基类派生控制器更为常见.
这个基类使我们能够访问大量有关请求的上下文信息,以及帮助我们构建结果以发送回客户端的方法.
您可以在响应中发回简单的字符串和整数.您还可以发回复杂的对象,如对象,以代表学生,大学或餐馆等,以及与该对象相关的所有数据.
这些结果是通常封装到实现IActionResult接口的对象中.
有许多不同的结果类型实现此接口 - 结果类型可以包含模型或内容一个可供下载的文件.
这些不同的结果类型可以让我们将JSON发送回客户端或XML或构建HTML的视图.
动作基本上会返回不同类型的动作结果. ActionResult类是所有操作结果的基础.以下是不同类型的操作结果及其行为的列表.
名称 | 行为 |
---|---|
ContentResult | 返回一个字符串 |
FileContentResult | 返回文件内容 |
FilePathResult | 返回文件内容 |
FileStreamResult | 返回文件内容. |
EmptyResult | 什么都不返回 |
JavaScriptResult | 返回执行脚本 |
JsonResult | 返回JSON格式的数据 |
RedirectToResult | 重定向到指定的网址 |
HttpUnauthorizedResult | Retu rns 403 HTTP状态代码 |
RedirectToRouteResult | 重定向到不同的操作/不同的控制器行动 |
ViewResult | 作为视图引擎的响应收到 |
PartialViewResult | 作为视图引擎的响应收到 |
让我们通过打开 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"); } } }
您现在可以看到索引方法正在返回ContentResult,它是其中之一结果类型和所有这些结果类型最终实现了一个接口,即 ActionResult .
在Index方法中,我们将一个字符串传递给Content方法.此Content方法生成ContentResult;这意味着Index方法现在将返回 ContentResult .
让我们保存 HomeController 类并在浏览器中运行该应用程序.它将生成以下页面.
你现在可以看到一个与我们之前的反应看起来没有任何不同的回应.它仍然只是一个纯文本响应.
你可能想知道使用什么东西有什么好处产生 ActionResult .
典型的优点是它只是封装控制器决策的正式方式.
控制器决定下一步做什么,返回字符串或HTML或返回可能被序列化为JSON等的模型对象.
控制器需要做的就是做出决定,控制器不必直接在响应中写下决定的结果.
它只需要返回决定,然后它就是一个框架,它将获取结果并理解如何将结果转换为可以通过HTTP发回的内容.
让我们再举一个例子.在项目中创建一个新文件夹并将其命名为模型.在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操作方法中,我们想要返回一个员工对象.以下是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响应.
保存所有文件和刷新浏览器.您将看到以下输出.