📅  最后修改于: 2020-11-21 04:56:55             🧑  作者: Mango
在本章中,我们将讨论行动结果。在前面的章节中,我们一直在使用简单的简单C#类作为控制器。这些类不是从基类派生的,您可以将这种方法与MVC一起使用,但是从Microsoft.AspNet.Mvc命名空间中提供的控制器基类派生控制器更为常见。
这个基础类使我们可以访问有关请求的许多上下文信息,以及可以帮助我们建立结果以发送回客户端的方法。
您可以在响应中发送回简单的字符串和整数。您还可以发回复杂的对象,例如代表学生,大学或饭店等的对象,以及与该对象关联的所有数据。
通常将这些结果封装到实现IActionResult接口的对象中。
有许多不同的结果类型可以实现此接口-结果类型可以包含模型或下载文件的内容。
这些不同的结果类型可以使我们将JSON发送回客户端或XML或构建HTML的视图。
动作基本上会返回不同类型的动作结果。 ActionResult类是所有操作结果的基础。以下是不同类型的操作结果及其行为的列表。
Name | Behavior |
---|---|
ContentResult | Returns a string |
FileContentResult | Returns file content |
FilePathResult | Returns file content |
FileStreamResult | Returns file content. |
EmptyResult | Returns nothing |
JavaScriptResult | Returns script for execution |
JsonResult | Returns JSON formatted data |
RedirectToResult | Redirects to the specified URL |
HttpUnauthorizedResult | Returns 403 HTTP Status code |
RedirectToRouteResult | Redirect to different action/ different controller action |
ViewResult | Received as a response for view engine |
PartialViewResult | Received as a response for view engine |
让我们通过打开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发送回的结果。
让我们再举一个例子。在项目中创建一个新文件夹,并将其命名为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并将一些模型对象传递给它。
ObjectResult在MVC框架中是特殊的,因为当我们返回ObjectResult时,MVC框架会查看该对象。该对象需要在HTTP响应中表示。
该对象应序列化为XML或JSON或其他某种格式,最终,将根据您在启动时提供给MVC的配置信息来做出决定。如果您不进行任何配置,则只会得到一些默认值,并且默认值为JSON响应。
保存所有文件并刷新浏览器。您将看到以下输出。