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

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7

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

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

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

public string Area(int altitude, int height)
{
    double square = altitude * height / 2;
    return $"Площадь треугольника с основанием {altitude} и высотой {height} равна {square}";
}

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

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

public Geometry Area(int altitude, int height)
{
    double square = altitude * height / 2;
    return new Geometry { Altitude = altitude, Height = height };
}

В данном случае использовался класс Geometry из прошлой темы.

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

public void GetVoid(int id)
{

}

В данном случае метод 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.

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

using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace ControllersApp.Util
{
    public class HtmlResult : IActionResult
    {
        string htmlCode;
        public HtmlResult(string html)
        {
            htmlCode = html;
        }
        public async Task ExecuteResultAsync(ActionContext context)
        {
            string fullHtmlCode = "<!DOCTYPE html><html><head>";
            fullHtmlCode += "<title>Главная страница</title>";
            fullHtmlCode += "<meta charset=utf-8 />";
            fullHtmlCode += "</head> <body>";
            fullHtmlCode += htmlCode;
            fullHtmlCode += "</body></html>";
            await context.HttpContext.Response.WriteAsync(fullHtmlCode);
        }
    }
}

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

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

using ControllersApp.Util; // пространство имен класса HtmlResult

public class HomeController : Controller
{
	public HtmlResult GetHtml()
    {
        return new HtmlResult("<h2>Привет ASP.NET 5</h2>");
    }
	
	//остальные методы контроллера
}

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

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

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

  • 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 { Name="Tom", Age=35});
    	}
    }
    class Person
    {
    	public string Name { get; set; }
    	public int Age { get; set; }
    }
    
  • 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