Контроллеры ASP.NET Core MVC. Результаты действий (IActionResult)

Как мы уже знаем, действия контроллера могут возвращать в своих результатах, в принципе, любой тип данных, как и обычный метод C#, даже пустой (void). Однако, чаще всего действия возвращают какой-либо объект, реализующий интерфейс IActionResult. И при разработке приложения в ASP.NET Core MVC нам, желательно, чтобы действия возвращали именно объекты реализующие этот интерфейс или Task<IActionResult> для асинхронных действий. 

Интерфейс IActionResult

У интерфейса IActionResult определен всего один метод:

public interface IActionResult
{
    Task ExecuteResultAsync(ActionContext context);
}

Метод ExecuteResultAsync принимает в качестве параметра контекст действия и на основании свойств этого объекта формирует ответ клиенту. Мы можем реализовать этот интерфейс, например, так:

public class HtmlPageAction : IActionResult
{
    private readonly string _html;
    private readonly string _title;

    public HtmlPageAction(string title, string htmlCode) 
    {
        _html = htmlCode;
        _title = title;
    }

    public Task ExecuteResultAsync(ActionContext context)
    {
        string page = "<!DOCTYPE html>"+
            "<html>" +
              "<head><meta charset= 'utf-8'/>" +
              $"<title>{_title}</title>"+
              "</head><body>" +
              $"{_html}"+
              "</body></html>";
        context.HttpContext.Response.ContentType = "text/html";
        return context.HttpContext.Response.WriteAsync(page);
    }
}

В конструктор класса передается заголовок страницы и её содержимое в виде html, а в методе ExecuteResultAsync() формируется уже готовая html-страница и отправляется пользователю. Теперь мы можем применить наш класс в контроллере:

using AspActionResults.Models;
using Microsoft.AspNetCore.Mvc;

namespace AspActionResults.Controllers
{
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return new HtmlPageAction("Пример", "<h1>Привет IActionResult</h1>");
        }
    }
}

При этом, стоит отметить, что нам крайне редко придётся создавать свои классы, реализующие IActionResult так как в ASP.NET Core MVC имеется достаточно большое количество классов, которые через своего предка — абстрактный класс ActionResult, реализуют этот интерфейс и позволяют возвращать большое количество различных результатов действий контроллеру — от статусных кодов до файлов. В свою очередь, эти классы создаются и возвращаются методами класса Controller(а, точнее, его предка — класса ControllerBase). Ниже приведен обзор классов-наследников ActionResult и методов класса Controller, которые объекты этих классов возвращают.

Наследники ActionResult и методы класса Controller

Класс-наследник ActionResult Метод класса Controller Описание  
AcceptedResult Accepted() Отправляет клиенту код статуса
202 Accepted
Запрос был принят на обработку, но она не завершена. Клиенту не обязательно дожидаться окончательной передачи сообщения, так как может быть начат очень долгий процесс
Пример использования см. здесь
AcceptedAtActionResult  AcceptedAtAction()
AcceptedAtRouteResult  AcceptedAtRoute()
BadRequestResult  BadRequest() Отправляет клиенту код статуса
400 Bad Request
сервер обнаружил в запросе клиента синтаксическую ошибку
Пример использования см. здесь
ChallengeResult Challenge() Используется для проверки аутентификации пользователя

Возможные коды статуса, отправляемые методом:

401 Unauthorized
для доступа к запрашиваемому ресурсу требуется аутентификация. В заголовке ответ должен содержать поле WWW-Authenticate с перечнем условий аутентификации
403 Forbidden
сервер понял запрос, но он отказывается его выполнять из-за ограничений в доступе для клиента к указанному ресурсу. Иными словами, клиент не уполномочен совершать операции с запрошенным ресурсом
ConflictResult  Conflict() Отправляет ответ с кодом статуса
409 Conflict
запрос не может быть выполнен из-за конфликтного обращения к ресурсу. Такое возможно, например, когда два клиента пытаются изменить ресурс с помощью метода PUT
Пример использования см. здесь
ContentResult  Content() Отправляет клиенту ответ в виде строки Пример использования см. здесь
CreatedResult  Created() Отправляет ответ с кодом статуса
201 Created
В результате успешного выполнения запроса был создан новый ресурс. Сервер может указать адрес(-а) созданного ресурса в теле ответа, при этом предпочтительный адрес указывается в заголовке Location. Формат тела ответа определяется заголовком Content-Type. При обработке запроса новый ресурс должен быть создан до отправки ответа клиенту, иначе следует использовать ответ с кодом 202 (см. метод Accepted())
Пример использования см. здесь
CreatedAtActionResult  CreatedAtAction()
CreatedAtRouteResult  CreatedAtRoute()
FileContentResult

FileStreamResult

VirtualFileResult

File() Отправляет клиенту указанный файл Пример использования см. здесь
ForbidResult  Forbid() По умолчанию, клиенту возвращается код статуса
403 Forbidden
сервер понял запрос, но он отказывается его выполнять из-за ограничений в доступе для клиента к указанному ресурсу. Иными словами, клиент не уполномочен совершать операции с запрошенным ресурсом
JsonResult  Json() Отправляет клиенту объект в формате JSON Пример использования см. здесь
LocalRedirectResult  LocalRedirect() Перенаправляет пользователя на локальный URL и возвращает код статуса
302 Found
запрошенный документ временно доступен по другому URI, указанному в заголовке в поле Location
Пример использования см. здесь
  LocalRedirectPermanent() Перенаправляет пользователя на локальный URL и возвращает код статуса
301 Moved Permanently
запрошенный документ был окончательно перенесен на новый URI, указанный в поле Location заголовка
  LocalRedirectPermanentPreserveMethod() Перенаправляет пользователя на локальный URL и возвращает код статуса
308 Permanent Redirect
запрашиваемый ресурс был окончательно перенесен на новый URI, указанный в поле Location заголовка
  LocalRedirectPreserveMethod() Перенаправляет пользователя на локальный URL и возвращает код статуса
307 Temporary Redirect
запрашиваемый ресурс на короткое время доступен по другому URI, указанный в поле Location заголовка
NoContentResult  NoContent() Отправляет ответ с кодом статуса
204 No Content
сервер успешно обработал запрос, но в ответе были переданы только заголовки без тела сообщения
Пример использования см. здесь
NotFoundResult  NotFound() Отправляет ответ с кодом статуса
404 Not Found
сервер понял запрос, но не нашёл соответствующего ресурса по указанному URL
Пример использования см. здесь
OkResult  Ok() Отправляет ответ с кодом статуса
200 OK
успешный запрос
Пример использования см. здесь
PartialViewResult  PartialView() Осуществляет рендеринг частичного представления в выходной поток Пример использования см. здесь
PhysicalFileResult PhysicalFile() Отправляет клиенту в ответ файл, находящийся по заданному пути Пример использования см. здесь
ObjectResult Problem() Применяет формат ProblemDetails для отправки ответа.
RedirectResult  Redirect() Осуществляет перенаправление клиента на заданный URL и возвращает код статуса
302 Found
запрошенный документ временно доступен по другому URI, указанному в заголовке в поле Location
Пример использования см. здесь
  RedirectPermanent() Осуществляет перенаправление клиента на заданный URL и возвращает код статуса
301 Moved Permanently
запрошенный документ был окончательно перенесен на новый URI, указанный в поле Location заголовка
  RedirectPermanentPreserveMethod() Осуществляет перенаправление клиента на заданный URL и возвращает код статуса
308 Permanent Redirect
запрашиваемый ресурс был окончательно перенесен на новый URI, указанный в поле Location заголовка
  RedirectPreserveMethod() Осуществляет перенаправление клиента на заданный URL и возвращает код статуса
307 Temporary Redirect
запрашиваемый ресурс на короткое время доступен по другому URI, указанный в поле Location заголовка
RedirectToActionResult RedirectToAction() Осуществляет перенаправление клиента на заданное действие и возвращает код статуса
302 Found
запрошенный документ временно доступен по другому URI, указанному в заголовке в поле Location
Пример использования см. здесь
  RedirectToActionPermanent() Осуществляет перенаправление клиента на заданное действие и возвращает код статуса
301 Moved Permanently
запрошенный документ был окончательно перенесен на новый URI, указанный в поле Location заголовка
  RedirectToActionPermanentPreserveMethod() Осуществляет перенаправление клиента на заданное действие и возвращает код статуса
308 Permanent Redirect
запрашиваемый ресурс был окончательно перенесен на новый URI, указанный в поле Location заголовка
  RedirectToActionPreserveMethod() Осуществляет перенаправление клиента на заданное действие и возвращает код статуса
307 Temporary Redirect
запрашиваемый ресурс на короткое время доступен по другому URI, указанный в поле Location заголовка
RedirectToPageResult RedirectToPage() Выполняет переадресацию на определенную страницу Razor (относится к подсистеме RazorPages) и возвращает код статуса
302 Found
запрошенный документ временно доступен по другому URI, указанному в заголовке в поле Location
  RedirectToPagePermanent() Выполняет переадресацию на определенную страницу Razor и возвращает код статуса
301 Moved Permanently
запрошенный документ был окончательно перенесен на новый URI, указанный в поле Location заголовка
  RedirectToPagePermanentPreserveMethod() Выполняет переадресацию на определенную страницу Razor и возвращает код статуса
308 Permanent Redirect
запрашиваемый ресурс был окончательно перенесен на новый URI, указанный в поле Location заголовка
  RedirectToPagePreserveMethod() Выполняет переадресацию на определенную страницу Razor и возвращает код статуса
307 Temporary Redirect
запрашиваемый ресурс на короткое время доступен по другому URI, указанный в поле Location заголовка
RedirectToRouteResult RedirectToRoute() Перенаправляет клиента на заданный маршрут и возвращает код статуса
302 Found
запрошенный документ временно доступен по другому URI, указанному в заголовке в поле Location
Пример использования см. здесь
  RedirectToRoutePermanent() Перенаправляет клиента на заданный маршрут и возвращает код статуса
301 Moved Permanently
запрошенный документ был окончательно перенесен на новый URI, указанный в поле Location заголовка
  RedirectToRoutePermanentPreserveMethod() Перенаправляет клиента на заданный маршрут и возвращает код статуса
308 Permanent Redirect
запрашиваемый ресурс был окончательно перенесен на новый URI, указанный в поле Location заголовка
  RedirectToRoutePreserveMethod() Перенаправляет клиента на заданный маршрут и возвращает код статуса
307 Temporary Redirect
запрашиваемый ресурс на короткое время доступен по другому URI, указанный в поле Location заголовка
SignInResult SignIn() Используется при проверке подлинности клиента
SignOutResult SignOut() Используется при выходе клиента из системы
StatusCodeResult  StatusCode() Отправляет клиенту заданный код статуса
UnauthorizedResult  Unauthorized() Отправляет ответ с кодом статуса
401 Unauthorized
для доступа к запрашиваемому ресурсу требуется аутентификация. В заголовке ответ должен содержать поле WWW-Authenticate с перечнем условий аутентификации
Пример использования см. здесь
UnauthorizedObjectResult  Unauthorized(Object)
UnprocessableEntityResult  UnprocessableEntity() Отправляет ответ с кодом статуса
422 Unprocessable Entity
сервер успешно принял запрос и может работать с указанным видом данных, однако имеется какая-то логическая ошибка, из-за которой невозможно произвести операцию над ресурсом
Пример использования см. здесь
ActionResult  ValidationProblem() Отправляет клиенту код статуса
400 Bad Request
сервер обнаружил в запросе клиента синтаксическую ошибку
ViewResult  View() Производит рендеринг представления и отправляет результаты рендеринга в виде html-страницы клиенту Пример использования см. здесь
ViewComponentResult  ViewComponent() Возвращает клиенту объект ViewComponent
VirtualFileResult нет

Далее мы рассмотрим некоторые из этих классов и методов класса Controller.

Итого

Обычно, действия контроллера возвращают объекты, реализующие интерфейс IActionResult. Мы можем самостоятельно создать класс, реализующий IActionResult, а можем воспользоваться уже готовыми классами и методами для отправки клиенту ответов с определенными статусными кодами.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии