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

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

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

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

В прошлой теме в примере с вычислением площади треугольника мы возвращали html-код в виде строки. Но, как правило, возвращаемым результатом является объект класса, производного от ActionResult. ActionResult представляет собой абстрактный класс, в котором определен один метод ExecuteResult, переопределяемый в классах-наследниках:

public abstract class ActionResult
{
   public abstract void ExecuteResult(ControllerContext context);
}

Создадим свои результаты действий. Они будут очень простыми. Возьмем какой-нибудь проект, например, из прошлой главы, и добавим в него новую папку Util, которая будет содержать новые классы. После добавления папки добавим в нее первый класс. Назовем его HtmlResult. Он у нас будет содержать следующий код:

using System.Web.Mvc;

namespace BookStore.Util
{
    public class HtmlResult : ActionResult
    {
        private string htmlCode;
        public HtmlResult(string html)
        {
            htmlCode = html;
        }
        public override void ExecuteResult(ControllerContext context)
        {
            string fullHtmlCode = "<!DOCTYPE html><html><head>";
            fullHtmlCode += "<title>Главная страница</title>";
            fullHtmlCode += "<meta charset=utf-8 />";
            fullHtmlCode += "</head> <body>";
            fullHtmlCode += htmlCode;
            fullHtmlCode += "</body></html>";
            context.HttpContext.Response.Write(fullHtmlCode);
        }
    }
}

В конструкторе класса HtmlResult получаем переданный html-код, а в методе Execute вставляем его в общее окружение, чтобы получилась полноценная html-страница, и пишем ее в выходной поток: context.HttpContext.Response.Write(fullHtmlCode);

Чтобы использовать этот класс подключим в контроллер пространство имен нового класса: using BookStore.Util; и добавим новый метод:

public ActionResult GetHtml()
{
    return new HtmlResult("<h2>Привет мир!</h2>");
}

И обратившись к этому методу из браузера, например, Home/GetHtml, мы получим html-страничку. Хотя данный пример довольно примитивен, но в целом он демонстрирует, как работают классы результатов действий.

Создадим еще один класс результатов. Добавим в папку Util новый класс ImageResult:

using System.Web.Mvc;

namespace BookStore.Util
{
    public class ImageResult : ActionResult
    {
        private string path;
        public ImageResult(string path)
        {
            this.path = path;
        }
        public override void ExecuteResult(ControllerContext context)
        {
            context.HttpContext.Response.Write("<div style='width:100%;text-align:center;'>" +
                "<img style='max-width:600px;' src='" + path + "' /></div>");
        }
    }
}

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

public ActionResult GetImage()
{
    string path = "../Images/visualstudio.png";
    return new ImageResult(path);
}

Здесь предполагается, что в проекте есть папка Images, в которой имеется изображение visualstudio.png. И тогда, если мы в браузере обратимся к этому действию, например, Home/GetImage, то сможем увидеть изображение.

Встроенные классы, производные от ActionResult

В реальности нам вряд ли потребуется часто создавать свои классы для обработки результата действия. Фрейморк ASP.NET MVC предлагает нам богатую палитру классов результатов действий, которые охватывают большинство, если не все возможные ситуации.

  • ContentResult: пишет указанный контент напрямую в ответ в виде строки, практически как предыдущие примеры

    Так, следующий пример:

    public string Square(int a, int h)
    {
        int s = a*h/2;
        return "<h2>Площадь треугольника с основанием " + a + 
    			" и высотой " + h + " равна " + s + "</h2>";
    }
    

    Можно переписать с использованием ContentResult следующим образом:

    public ContentResult Square(int a, int h)
    {
        int s = a*h/2;
        return Content("<h2>Площадь треугольника с основанием " + a + 
    			" и высотой " + h + " равна " + s + "</h2>");
    }
    

    Даже если мы оставим в качестве возвращаемого результата тип string, то фреймворк увидит, что возвращаемый тип не является объектом ActionResult. И тогда автоматически создается объект ContentResult для возвращаемой строки.

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

  • FileResult: является базовым классом для всех объектов, пишущих бинарный ответ в выходной поток. Предназначен для отправки файлов

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

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

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

  • HttpStatusCodeResult: результат действия, который возвращает клиенту определенный статусный код HTTP

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

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

  • JavaScriptResult: возвращает в ответ в качестве содержимого код JavaScript

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

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

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

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

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

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

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