This article is currently in the process of being translated into Chinese (~94% done).
Actions
由于控制器就是一个常规的.NET类,它可以拥有字段、属性和方法。控制器的方法格外有趣,因为它们将浏览器(也就是用户端)和你的程序连接在一起。基于这点原因,Acition指的就是控制器类中的方法 —— 在你的程序中,一个方法通常对应了一个Action,这个Action会向浏览器(或者说,用户端)返回一些东西。
由于浏览器通过调用URL链接来工作,你需要将URL转换为对应的控制器和Action(方法)。例如,浏览器请求了一个链接,类似于/products/1/。然后,你想要ProductsController控制器中的Details方法(或者说Action)来处理这个请求。要完成这个过程,就要引入路由的概念。我们将在本系列教程的后续详细讲解路由。现在暂时只需要知道,路由将URL和你控制器中的Action连接到了一起。
当你创建控制器的时候,你要牢牢记住——控制器中,所有用 public 修饰的方法,都会被视为一个Action。这意味着,如果你定义了一个可以拦截所有路由规则的控制器(这么做很常见),那么,理论上,你控制器类中的所有方法都可以被一个URL链接访问。因此,如果控制器中有你不希望被终端用户调用到的方法,确保该方法用private进行修饰。如果你真的需要一个被标记为public的方法,但又不想它被URL调用,也有一个解决办法——你可以在该方法的上方标记一个[NonAction] 特性。
Action 动词
为了更好地控制Action的调用方式,你可以使用如是所说的Action动词。这些所谓的Action动词实际上都是常规的.NET特性,这些特性将告诉.Net Framework调用Action的方式。如果不加这些特性,一个Action就能够访问和使用所有可能的HTTP方法(最常见的两个是GET方法和POST方法),但你可以很容易地改变它:
[HttpGet]
public IActionResult Edit()
{
return Content("Edit");
}
现在,这个名为Edit的Action只可以被GET请求所访问。在很多方法都使用同一个名称的时候,使用不同特性修饰Action就带来了额外的好处,因为它们并不都接收同一种请求方法。例如,你可以让两个方法都叫做Edit:第一个只能由GET请求来访问,并生成一个FORM表单来编辑一个项目;而第二个只会由POST请求来访问,在FORM表单被传回服务器时,它用来更新被编辑的项目。看起来就像下面这样:
[HttpGet]
public IActionResult Edit()
{
return View();
}
[HttpPost]
public IActionResult Edit(Product product)
{
product.Save();
return Content("Product updated!");
}
现在,无论Edit()方法(或者说Action)在何时被调用了,最终响应的方法都会基于请求的种类判断,要看它是GET请求还是POST请求。
在某些情况下,你也许想指派多个Action动词。例如,指定一个Action只能由POST请求和GET请求访问,而不能被其它类型的请求访问。想做到这点其实很容易:
[HttpGet]
[HttpPost]
public IActionResult Edit()
{
...
总结
我们现在终于学习了控制器相关知识中最重要的一点:Action。有时候也被称为Action方法,或者干脆直接被叫做方法——这是因为Action本质上就是方法。在下一篇文章中,我们将讨论这些Action的返回值,也被称为ActionResult。