Как мы уже знаем, действия контроллера могут возвращать в своих результатах, в принципе, любой тип данных, как и обычный метод 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, а можем воспользоваться уже готовыми классами и методами для отправки клиенту ответов с определенными статусными кодами.
