TOC

This article is currently in the process of being translated into Chinese (~94% done).

Controllers:

Action Results

在上一篇文章中,我们对Action进行了讨论,实际上就是定义在控制器中的方法。控制器中的Action将会在请求URL匹配成功的时候被调用(URL匹配是由路由系统完成的)。当Action(或者说,方法)完成它的工作后,通常它将给客户端返回一些东西。而返回的结果通常实现了IActionResult接口 (或者,当方法为异步方法时,返回的类型就是 Task<IActionResult>)。

一旦你的控制器实现了内置的Controller基类(Microsoft.AspNetCore.Mvc.Controller),我们就获得了一大堆可以帮助我们来生成响应(ActionResult)的方法。当前教程中已经使用了这样的一个方法来作为例子:也就是View()方法。它会找到对应的View文件,然后将它转换为一个ViewResult类型的实例。同时,ViewResult也实现了IActionResult接口。在这之后,ASP.NET MVC框架将自动将其转换为浏览器响应——在本例中,该响应为一个"OK"状态码,紧随其后的是一段HTML代码体。

然而,控制器中的Action能返回的结果远远不止视图一种。由于最终的结果会返回给浏览器,那么可用的方法应该涵盖了HTTP请求的所有可能的结果。因此,一个Action也可以重定向浏览器,比如跳转到一个404页面(未找到目标时显示该页面),或者返回其它HTTP状态码。下面的列表罗列了一些用于生成ActionResult的方法(不完全统计,仅列举一部分最有趣、也是最有用的方法)。

  • Content()方法 —— 向客户端(通常是浏览器)以纯文本的形式返回特定的字符串
  • View()方法 —— 向客户端返回一个视图
  • PartialView()方法 —— 向客户端返回一个部分视图(本系列教程有关于部分视图详细内容的文章)
  • File()方法 —— 向客户端返回特定文件中的内容
  • Json()方法 —— 将一个JSON字符串返回给客户端
  • Redirect()方法RedirectPermanent()方法 —— 向浏览器发送重定向请求(临时重定向或永久重定向),将用户的地址重定向到另一个URL地址。
  • StatusCode()方法 —— 向客户端返回一个自定义状态码

还有很多这样的方法,你也可以随意实现你自己的方法或者自行生成返回结果——这些方法只是简单地生成了具有相关属性的类。例如,Content()方法只是简单地生成了ContentResult类,然后把你传给方法的值填到它的Content 属性里面。

有许多种类的响应,它们已经实现了IActionResult接口,因此你的Action可以将它们中的任意一种作为返回结果。具体返回哪一种响应,要结合你方法中的处理逻辑。常用的使用场景是:在请求的内容被找到时,将一个视图或是一条内容返回;或是在没找到目标内容的时候,返回404错误(未找到目标时显示该页面)。该使用场景的具体例子如下所示:

public IActionResult Details(int id)  
{  
	Product product = GetProduct(id);
	if (product != null)  
		return View(product);  
	return NotFound();  
}

在第一行代码中,我们尝试加载被请求的产品,使用GetProduct()方法(在本例中,没有给出该方法的具体实现细节)。如果目标产品被找到了,我们就把它夹在视图里,然后使用View() 方法将它和视图一并作为返回结果。如果没有找到,我们就用NotFound方法返回404错误。NotFound方法是一个封装好的帮助类,只是简单地创建了NotFoundResult类的一个实例。所以在这种情况下,Action就会有两种不同的返回结果。但如果需要更多种返回结果的话,你可以随意地返回任何东西,只要是实现了IActionResult接口的就行。

总结

一个Action就是一个控制器中的方法,通常在路由系统的配合下,由一个URL进行访问。一个Action将返回Action结果,该结果实现了IActionResult接口。有很多可用的帮助方法来辅助你生成你想要的Action结果。我说的这些内容,对于理解ASP.NET MVC中的控制器很重要。在接下来的文章中,我们将深入学习控制器高级篇。


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!