Результаты действий

Последнее обновление: 21.03.2022

При обращении к веб-приложению, как правило, пользователь ожидает получить некоторый ответ, например, в виде веб-страницы, которая наполнена данными. На стороне сервера метод контроллера, получая параметры и данные запроса, обрабатывает их и формирует ответ в виде результата действия. Результат действия - это тот объект, который возвращается методом после обработки запроса.

Результатом действия может быть практически что угодно. Например, в прошлых темах использовался объект string, например:

public string Index()
{
    return "Hello METANIT.COM";
}

Пользователь передает методу некоторые значения и ответ на запрос видит в своем браузере строку ответа.

Результатом действия может быть какой-нибудь сложный объект:

using Microsoft.AspNetCore.Mvc;

namespace MvcApp.Controllers
{
    public class HomeController : Controller
    {
        public Message Index() => new Message("Hello METANIT.COM");
    }
    public record class Message(string Text);
}

Результатом может быть даже void, то есть по сути ничего:

public void GetVoid()
{

}

В данном случае метод GetVoid представляет вполне реальное действие контроллера, к которому можно обращаться из адресной строки браузера, передавать параметры, и который может содержать сложную логику обработки запроса. Только после обращения к этому методу пользователь увидит в своем веб-браузере одну пустоту, так как метод ничего не возвращает.

Но в большинстве случаев мы будем иметь дело не с void и даже не с типом string, а с объектами типа IActionResult, которые непосредственно предназначены для генерации результата действия. Интерфейс IActionResult находится в пространстве имен Microsoft.AspNetCore.Mvc и определяет один метод:

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

Метод ExecuteResultAsync() принимает контекст действия и выполняет генерацию результата.

Этот интерфейс затем реализуется абстрактным базовым классом ActionResult:

public abstract class ActionResult : IActionResult
{
    public virtual Task ExecuteResultAsync(ActionContext context)
    {
            ExecuteResult(context);
            return Task.FromResult(true);
    }

    public virtual void ExecuteResult(ActionContext context)
    {
    }
}

ActionResult добавляет синхронный метод, который выполняется в асинхронном. И если мы вдруг захотим создать свой класс результата действий, то как раз можем либо унаследовать его от ActionResult, либо реализовать интерфейс IActionResult.

Итак, создадим свой класс результата действий. Для этого вначале добавим в проект новый класс, который назовем HtmlResult:

IActionResult и создание своего результата действий в ASP.NET Core MVC и C#

Определим в нем следующий код:

using Microsoft.AspNetCore.Mvc;

namespace MvcApp
{
    public class HtmlResult : IActionResult
    {
        string htmlCode;
        public HtmlResult(string html) => htmlCode = html;
        public async Task ExecuteResultAsync(ActionContext context)
        {
            string fullHtmlCode = @$"<!DOCTYPE html>
            <html>
                <head>
                    <title>METANIT.COM</title>
                    <meta charset=utf-8 />
                </head>
                <body>{htmlCode}</body>
            </html>";
            await context.HttpContext.Response.WriteAsync(fullHtmlCode);
        }
    }
}

Данный класс будет реализовать интерфейс IActionResult. В конструкторе он принимает html-код, который затем будет выводиться на веб-страницу. Для вывода используется асинхронный метод context.HttpContext.Response.WriteAsync()

Теперь используем этот класс в контроллере:

using Microsoft.AspNetCore.Mvc;

namespace MvcApp.Controllers
{
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return new HtmlResult("<h2>Hello METANIT.COM!</h2>");
        }
    }
}

Здесь определен метод Index(), который возвращает объект HtmlResult. При обращении к этому объекту будет срабатывать его метод ExecuteResultAsync(), в котором будет происходить генерация html-страницы:

Создание результата действий и IActionResult в ASP.NET Core MVC и C#

Однако в большинстве случаев нам не придется создавать свои классы результатов, потому что фреймворк ASP.NET Core MVC итак предоставляет довольно большую палитру классов результатов для самых различных ситуаций:

  • ContentResult: отправляет в ответ в виде строки

  • EmptyResult: отправляет пустой ответ в виде статусного кода 200

    public IActionResult GetVoid()
    {
        return new EmptyResult();
    }
    

    Аналогичен следующему методу:

    public void GetVoid()
    {
    }
    
  • NoContentResult: во многом похож на EmptyResult, также отправляет пустой ответ, только в виде статусного кода 204

    public IActionResult GetVoid()
    {
        return new NoContentResult();
    }
    
  • FileResult: является базовым классом для всех объектов, которые пишут набор байтов в выходной поток. Предназначен для отправки файлов

  • FileContentResult: класс, производный от FileResult, пишет в ответ массив байтов

  • VirtualFileResult: также производный от FileResult класс, пишет в ответ файл, находящийся по заданному пути

  • PhysicalFileResult: также производный от FileResult класс, пишет в ответ файл, находящийся по заданному пути. Только в отличие от предыдущего класса использует физический путь, а не виртуальный.

  • FileStreamResult: класс, производный от FileResult, пишет бинарный поток в выходной ответ

  • ObjectResult: возвращает произвольный объект, как правило, применяется в качестве базового класса для других классов результатов. Но можно применять и самостоятельно:

    public class HomeController : Controller
    {
    	public IActionResult Index()
    	{
    		return new ObjectResult(new Person("Tom", 37));
    	}
    }
    record class Person(string Name, int Age);
    
  • StatusCodeResult: результат действия, который возвращает клиенту определенный статусный код HTTP

  • UnauthorizedResult: класс, производный от StatusCodeResult. Возвращает клиенту ответ в виде статусного кода HTTP 401, указывая, что пользователь не прошел авторизацию и не имеет прав доступа к запрошенному ресурсу.

  • NotFoundResult: производный от StatusCodeResult. Возвращает клиенту ответ в виде статусного кода HTTP 404, указывая, что запрошенный ресурс не найден

  • NotFoundObjectResult: производный от ObjectResult. Также возвращает клиенту ответ в виде статусного кода HTTP 404 с дополнительной информацией

  • BadRequestResult: производный от StatusCodeResult. Возвращает статусный код 400, тем самым указывая, что запрос некорректен

  • BadRequestObjectResult: производный от ObjectResult. Возвращает статусный код 400 с некоторой дополнительной информацией

  • OkResult: производный от StatusCodeResult. Возвращает статусный код 200, который уведомляет об успешном выполнении запроса

  • OkObjectResult: производный от ObjectResult. Возвращает статусный код 200 с некоторой дополнительной информацией

  • CreatedResult: возвращает статусный код 201, который уведомляет о создании нового ресурса. В качестве параметра принимает адрес нового ресурса

  • CreatedAtActionResult: возвращает статусный код 201, который уведомляет о создании нового ресурса. В качестве параметра принимает название метода и контроллера, а также параметров запроса, которые вместе создают адрес нового ресурса

  • CreatedAtRouteResult: возвращает статусный код 201, который уведомляет о создании нового ресурса. В качестве параметра принимает название маршрута, который используется для создания адреса нового ресурса

  • AcceptedResult: возвращает статусный код 202

  • AcceptedAtActionResult: возвращает статусный код 202. В качестве параметра принимает название метода и контроллера, а также параметров запроса

  • AcceptedAtRouteResult: возвращает статусный код 202. В качестве параметра принимает название и параметры маршрута

  • ChallengeResult: используется для проверки аутентификации пользователя

  • JsonResult: возвращает в качестве ответа объект или набор объектов в формате JSON

  • PartialViewResult: производит рендеринг частичного представления в выходной поток

  • RedirectResult: перенаправляет пользователя по другому адресу URL, возвращая статусный код 302 для временной переадресации или код 301 для постоянной переадресации зависимости от того, установлен ли флаг Permanent.

  • RedirectToRouteResult: класс работает подобно RedirectResult, но перенаправляет пользователя по определенному адресу URL, указанному через параметры маршрута

  • RedirectToActionResult: выполняет переадресацию на определенный метод контроллера

  • <
  • RedirectToPageResult: выполняет переадресацию на определенную странцу Razor (относится к подсистеме RazorPages)

  • li>

    LocalRedirectResult: перенаправляет пользователя по определенному адресу URL в рамках веб-приложения

  • ViewComponentResult: возвращает в ответ сущность ViewComponent

  • ViewResult: производит рендеринг представления и отправляет результаты рендеринга в виде html-страницы клиенту

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

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850