This article is currently in the process of being translated into Russian (~99% done).
Actions
Так как Контроллер является обычным .NET классом, он может иметь поля, свойства и методы. Особый интерес представляют методы Контроллера, потому что, они являются связью между браузером (и, как следствие, пользователем) и Вашим приложением. По этой причине, методы Контроллера называют действиями - метод обычно соответствует действию в Вашем приложении, которое возвращает что-либо браузеру/пользователю.
Так как браузер работает за счет URL-запросов, Вам необходимо что-то, что может переводить URL в соответствующий Контроллер и действие (метод). Например, браузер может направить URL-запрос, как /products/1/, в ответ на что, Вы бы хотели, чтобы Ваш ProductsController обработал данный запрос в методе/действии под названием Details. Это происходит при помощи концепта маршрутизации (Routing), того, о чем нам предстоит узнать более подробно в других разделах данного обучающего курса. Однако, на данный момент, достаточно лишь знать, что маршрутизация - это то, что соединяет URL-запросы с действиями Вашего Контроллера.
При создании Ваших Контроллеров, имейте ввиду, что все публичные методы класса-Контроллера расцениваются как Действия. Это означает, что если Вы определили общие (открытые) правила маршрутизации для Вашего Контроллера (что является обычным делом), то, теоретически, ко всем его методам можно обратится при помощи URL-запросов. Так что, если у Вас в Контроллере есть методы, которые не должны иметь возможность быть вызванными пользователем, они должны быть обозначены модификатором доступа private. В качестве альтернативы, при необходимости оставить метод публичным, но при этом недоступным для URL-запросов, Вы можете обозначить его атрибутом [NonAction].
Атрибуты действий
Чтобы получить больше контроля над тем, как Ваши действия вызываются, Вы можете обозначить их, так называемым, атрибутами действия (Action Verbs). По факту, это обычные атрибуты .NET, которые скажут фреймворку .NET, как можно получить доступ к действию. Без этих атрибутов, доступ к действию можно получить использую методы HTTP (самыми распространенными являются GET и POST), но Вы можете заменить их довольно легко:
[HttpGet]
public IActionResult Edit()
{
return Content("Edit");
}
Теперь действие Edit может быть вызвано только GET запросом. У этого есть свои преимущества, которые позволяют Вам иметь несколько методов с одинаковым названием, при условии, что они не принимают запросы одного и того же типа. Так, к примеру, Вы можете иметь два метода Edit: первый будет доступен для GET запросов и генерировать формы для редактирования объекта, в то время как второй будет доступен только для POST запросов и будет использован для обновления объекта, когда форма была отправлена обратно на сервер. Это выглядит так:
[HttpGet]
public IActionResult Edit()
{
return View();
}
[HttpPost]
public IActionResult Edit(Product product)
{
product.Save();
return Content("Product updated!");
}
Теперь, когда совершается запрос к методу/действию Edit(), выбор метода, который фактически ответит на запрос будет зависеть от того, является ли этот запрос GET или POST запросом.
В некоторых ситуациях, у Вас может возникнуть желание указать несколько атрибутов действия, например, чтобы обозначить, что действие может быть вызвано как обоими POST и GET запросами, так и запросами других типов. Всего-то необходимо сделать следующее:
[HttpGet]
[HttpPost]
public IActionResult Edit()
{
...
Заключение
Мы узнали больше об одних из самых важных аспектах Контроллера - Действиях (Actions), которые иногда называют Методами-Действиями (Action Methods) или просто методами, так как, это и есть то, чем они являются по существу.