- ASP.NET Core 教程
- ASP.NET Core - 首页
- ASP.NET Core - 概述
- ASP.NET Core - 环境设置
- ASP.NET Core - 新建项目
- ASP.NET Core - 项目布局
- ASP.NET Core - Project.Json
- ASP.NET Core - 配置
- ASP.NET Core - 中间件
- ASP.NET Core - 异常处理
- ASP.NET Core - 静态文件
- ASP.NET Core - 设置 MVC
- ASP.NET Core - MVC 设计模式
- ASP.NET Core - 路由
- ASP.NET Core - 属性路由
- ASP.NET Core - 操作结果
- ASP.NET Core - 视图
- 设置 Entity Framework
- ASP.NET Core - DBContext
- ASP.NET Core - Razor 布局视图
- ASP.NET Core - Razor 视图启动
- ASP.NET Core - Razor 视图导入
- ASP.NET Core - Razor 标签助手
- ASP.NET Core - Razor 编辑表单
- ASP.NET Core - 身份概述
- ASP.NET Core - 授权特性
- 身份配置
- ASP.NET Core - 身份迁移
- ASP.NET Core - 用户注册
- ASP.NET Core - 创建用户
- ASP.NET Core - 登录和注销
- ASP.NET Core 有用资源
- ASP.NET Core - 快速指南
- ASP.NET Core - 有用资源
- ASP.NET Core - 讨论
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** 类并在浏览器中运行应用程序。它将生成以下页面。
现在你可以看到一个响应,它与我们之前看到的响应没有什么不同。它仍然只是一个纯文本响应。
你可能想知道使用生成 **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); } } }
现在,我们不再返回 Content,而是返回一种称为 **ObjectResult** 的不同类型的结果。如果我们想要 ObjectResult,我们需要创建一个或实例化一个 ObjectResult 并向其中传递一些 **model** 对象。
ObjectResult 在 MVC 框架中是特殊的,因为当我们返回 ObjectResult 时,MVC 框架会查看此对象。此对象需要在 HTTP 响应中表示。
此对象应序列化为 XML 或 JSON 或其他某种格式,最终,决策将基于你在启动时提供给 MVC 的配置信息做出。如果你没有配置任何内容,你只会获得一些默认值,默认值是 JSON 响应。
保存所有文件并刷新浏览器。你将看到以下输出。