В этой главе мы обсудим результаты действий. В предыдущих главах мы использовали простые простые классы C # в качестве контроллеров. Эти классы не являются производными от базового класса, и вы можете использовать этот подход с MVC, но более распространенным является вывод контроллера из базового класса контроллера, предоставленного в пространстве имен Microsoft.AspNet.Mvc.
-
Этот базовый класс предоставляет нам доступ к большому количеству контекстной информации о запросе, а также к методам, которые помогают нам создавать результаты для отправки обратно клиенту.
-
Вы можете отправить обратно простые строки и целые числа в ответе. Вы также можете отправить сложные объекты, такие как объект, для представления студента, университета, ресторана и т. Д., А также все данные, связанные с этим объектом.
-
Эти результаты обычно инкапсулируются в объект, который реализует интерфейс IActionResult.
-
Существует много различных типов результатов, которые реализуют этот интерфейс — типы результатов, которые могут содержать модели или содержимое файла для загрузки.
-
Эти различные типы результатов могут позволить нам отправить обратно JSON клиенту или XML или представление, которое создает HTML.
Этот базовый класс предоставляет нам доступ к большому количеству контекстной информации о запросе, а также к методам, которые помогают нам создавать результаты для отправки обратно клиенту.
Вы можете отправить обратно простые строки и целые числа в ответе. Вы также можете отправить сложные объекты, такие как объект, для представления студента, университета, ресторана и т. Д., А также все данные, связанные с этим объектом.
Эти результаты обычно инкапсулируются в объект, который реализует интерфейс IActionResult.
Существует много различных типов результатов, которые реализуют этот интерфейс — типы результатов, которые могут содержать модели или содержимое файла для загрузки.
Эти различные типы результатов могут позволить нам отправить обратно JSON клиенту или XML или представление, которое создает HTML.
Действия в основном возвращают различные типы результатов действий. Класс ActionResult является базой для всех результатов действия. Ниже приведен список различных видов результатов действий и их поведения.
название | Поведение |
---|---|
ContentResult | Возвращает строку |
FileContentResult | Возвращает содержимое файла |
FilePathResult | Возвращает содержимое файла |
FileStreamResult | Возвращает содержимое файла. |
EmptyResult | Ничего не возвращает |
JavaScriptResult | Возвращает скрипт для исполнения |
JsonResult | Возвращает данные в формате JSON |
RedirectToResult | Перенаправляет на указанный URL |
HttpUnauthorizedResult | Возвращает код состояния HTTP 403 |
RedirectToRouteResult | Перенаправление на другое действие / другое действие контроллера |
ViewResult | Получен в качестве ответа для просмотра движка |
PartialViewResult | Получен в качестве ответа для просмотра движка |
Пример 1
Давайте выполним простой пример, открыв класс HomeController и выведя его из класса, основанного на контроллере. Этот базовый класс находится в пространстве имен Microsoft.AspNet.Mvc . Ниже приведена реализация класса HomeController.
using Microsoft.AspNet.Mvc; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace FirstAppdemo.Controllers { public class HomeController : Controller { public ContentResult Index() { return Content("Hello, World! this message is from Home Controller using the Action Result"); } } }
Теперь вы можете видеть, что метод index возвращает ContentResult, который является одним из типов результатов, и все эти типы результатов в конечном итоге реализуют интерфейс, который является ActionResult .
В методе Index мы передали строку в метод Content. Этот метод Content создает ContentResult; это означает, что метод Index теперь будет возвращать ContentResult .
Давайте сохраним класс HomeController и запустим приложение в браузере. Будет произведена следующая страница.
Теперь вы можете увидеть ответ, который ничем не отличается от ответа, который мы имели раньше. Это все еще будет простой текстовый ответ.
-
Вам может быть интересно, каково преимущество использования чего-то, что создает ActionResult .
-
Типичное преимущество заключается в том, что это просто формальный способ инкапсулировать решение контроллера.
-
Контроллер решает, что делать дальше: либо вернуть строку или HTML, либо вернуть объект модели, который может быть сериализован в JSON и т. Д.
-
Все, что нужно сделать контроллеру, — это принять это решение, и контроллеру не нужно прямо записывать в ответ результаты своего решения.
-
Нужно просто вернуть решение, и тогда это среда, которая возьмет результат и поймет, как преобразовать этот результат во что-то, что может быть отправлено обратно по HTTP.
Вам может быть интересно, каково преимущество использования чего-то, что создает ActionResult .
Типичное преимущество заключается в том, что это просто формальный способ инкапсулировать решение контроллера.
Контроллер решает, что делать дальше: либо вернуть строку или HTML, либо вернуть объект модели, который может быть сериализован в JSON и т. Д.
Все, что нужно сделать контроллеру, — это принять это решение, и контроллеру не нужно прямо записывать в ответ результаты своего решения.
Нужно просто вернуть решение, и тогда это среда, которая возьмет результат и поймет, как преобразовать этот результат во что-то, что может быть отправлено обратно по HTTP.
Пример 2
Давайте возьмем другой пример. Создайте новую папку в проекте и назовите ее « Модели» . Внутри папки Models мы хотим добавить класс, который может представлять Employee.
Введите Employee.cs в поле Имя, как на скриншоте выше. Здесь реализация класса Employee содержит два свойства.
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace FirstAppDemo.Models { public class Employee { public int ID { get; set; } public string Name { get; set} } }
Внутри метода действия Index HomeController мы хотим вернуть объект Employee. Ниже приведена реализация HomeController.
using FirstAppDemo.Models; using Microsoft.AspNet.Mvc; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace FirstAppdemo.Controllers { public class HomeController : Controller { public ObjectResult Index() { var employee = new Employee { ID = 1, Name = "Mark Upston"}; return new ObjectResult(employee); } } }
Теперь вместо того, чтобы возвращать содержимое, мы будем возвращать другой тип результата, который известен как ObjectResult . Если нам нужен ObjectResult, нам нужно создать или создать экземпляр ObjectResult и передать в него некоторый объект модели .
-
ObjectResult является особенным в среде MVC, потому что когда мы возвращаем ObjectResult, среда MVC смотрит на этот объект. Этот объект должен быть представлен в ответе HTTP.
-
Этот объект должен быть сериализован в XML, JSON или другой формат, и в конечном итоге решение будет принято на основе информации о конфигурации, которую вы передаете MVC при запуске. Если вы ничего не настраиваете, вы просто получаете некоторые значения по умолчанию, и по умолчанию используется ответ JSON.
ObjectResult является особенным в среде MVC, потому что когда мы возвращаем ObjectResult, среда MVC смотрит на этот объект. Этот объект должен быть представлен в ответе HTTP.
Этот объект должен быть сериализован в XML, JSON или другой формат, и в конечном итоге решение будет принято на основе информации о конфигурации, которую вы передаете MVC при запуске. Если вы ничего не настраиваете, вы просто получаете некоторые значения по умолчанию, и по умолчанию используется ответ JSON.
Сохраните все свои файлы и обновите браузер. Вы увидите следующий вывод.