Как мы уже знаем, действия контроллера могут возвращать в своих результатах, в принципе, любой тип данных, как и обычный метод 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() |
Отправляет клиенту код статуса | Пример использования см. здесь |
AcceptedAtActionResult |
Accepted |
||
AcceptedAtRouteResult |
Accepted |
||
BadRequestResult |
Bad |
Отправляет клиенту код статуса | Пример использования см. здесь |
ChallengeResult |
Challenge() |
Используется для проверки аутентификации пользователя
Возможные коды статуса, отправляемые методом: |
|
ConflictResult |
Conflict() |
Отправляет ответ с кодом статуса | Пример использования см. здесь |
ContentResult |
Content() |
Отправляет клиенту ответ в виде строки | Пример использования см. здесь |
CreatedResult |
Created() |
Отправляет ответ с кодом статуса | Пример использования см. здесь |
CreatedAtActionResult |
Created |
||
CreatedAtRouteResult |
Created |
||
FileContentResult
|
File() |
Отправляет клиенту указанный файл | Пример использования см. здесь |
ForbidResult |
Forbid() |
По умолчанию, клиенту возвращается код статуса | |
JsonResult |
Json() |
Отправляет клиенту объект в формате JSON | Пример использования см. здесь |
LocalRedirectResult |
Local |
Перенаправляет пользователя на локальный URL и возвращает код статуса | Пример использования см. здесь |
Local |
Перенаправляет пользователя на локальный URL и возвращает код статуса | ||
Local |
Перенаправляет пользователя на локальный URL и возвращает код статуса | ||
Local |
Перенаправляет пользователя на локальный URL и возвращает код статуса | ||
NoContentResult |
No |
Отправляет ответ с кодом статуса | Пример использования см. здесь |
NotFoundResult |
Not |
Отправляет ответ с кодом статуса | Пример использования см. здесь |
OkResult |
Ok() |
Отправляет ответ с кодом статуса | Пример использования см. здесь |
PartialViewResult |
Partial |
Осуществляет рендеринг частичного представления в выходной поток | Пример использования см. здесь |
PhysicalFileResult |
Physical |
Отправляет клиенту в ответ файл, находящийся по заданному пути | Пример использования см. здесь |
ObjectResult |
Problem() |
Применяет формат ProblemDetails для отправки ответа. |
|
RedirectResult |
Redirect() |
Осуществляет перенаправление клиента на заданный URL и возвращает код статуса | Пример использования см. здесь |
Redirect |
Осуществляет перенаправление клиента на заданный URL и возвращает код статуса | ||
Redirect |
Осуществляет перенаправление клиента на заданный URL и возвращает код статуса | ||
Redirect |
Осуществляет перенаправление клиента на заданный URL и возвращает код статуса | ||
RedirectToActionResult |
Redirect |
Осуществляет перенаправление клиента на заданное действие и возвращает код статуса | Пример использования см. здесь |
Redirect |
Осуществляет перенаправление клиента на заданное действие и возвращает код статуса | ||
Redirect |
Осуществляет перенаправление клиента на заданное действие и возвращает код статуса | ||
Redirect |
Осуществляет перенаправление клиента на заданное действие и возвращает код статуса | ||
RedirectToPageResult |
Redirect |
Выполняет переадресацию на определенную страницу Razor (относится к подсистеме RazorPages) и возвращает код статуса | |
Redirect |
Выполняет переадресацию на определенную страницу Razor и возвращает код статуса | ||
Redirect |
Выполняет переадресацию на определенную страницу Razor и возвращает код статуса | ||
Redirect |
Выполняет переадресацию на определенную страницу Razor и возвращает код статуса | ||
RedirectToRouteResult |
Redirect |
Перенаправляет клиента на заданный маршрут и возвращает код статуса | Пример использования см. здесь |
Redirect |
Перенаправляет клиента на заданный маршрут и возвращает код статуса | ||
Redirect |
Перенаправляет клиента на заданный маршрут и возвращает код статуса | ||
Redirect |
Перенаправляет клиента на заданный маршрут и возвращает код статуса | ||
SignInResult |
Sign |
Используется при проверке подлинности клиента | |
SignOutResult |
Sign |
Используется при выходе клиента из системы | |
StatusCodeResult |
Status |
Отправляет клиенту заданный код статуса | |
UnauthorizedResult |
Unauthorized() |
Отправляет ответ с кодом статуса | Пример использования см. здесь |
UnauthorizedObjectResult |
Unauthorized(Object) |
||
UnprocessableEntityResult |
Unprocessable |
Отправляет ответ с кодом статуса | Пример использования см. здесь |
ActionResult |
Validation |
Отправляет клиенту код статуса | |
ViewResult |
View() |
Производит рендеринг представления и отправляет результаты рендеринга в виде html-страницы клиенту | Пример использования см. здесь |
ViewComponentResult |
View |
Возвращает клиенту объект ViewComponent |
|
VirtualFileResult |
нет |
Далее мы рассмотрим некоторые из этих классов и методов класса Controller
.
Итого
Обычно, действия контроллера возвращают объекты, реализующие интерфейс IActionResult
. Мы можем самостоятельно создать класс, реализующий IActionResult
, а можем воспользоваться уже готовыми классами и методами для отправки клиенту ответов с определенными статусными кодами.