Общие сведения о контроллерах в ASP.NET MVC (C#)
В этом руководстве Стивен Уолтер знакомит вас с ASP.NET контроллерами MVC. Вы узнаете, как создавать новые контроллеры и возвращать различные типы результатов действий.
В этом руководстве рассматривается тема ASP.NET контроллеров MVC, действий контроллеров и результатов действий. После завершения работы с этим руководством вы узнаете, как контроллеры используются для управления взаимодействием посетителя с веб-сайтом ASP.NET MVC.
Основные сведения о контроллерах
Контроллеры MVC отвечают за реагирование на запросы к веб-сайту ASP.NET MVC. Каждый запрос браузера сопоставляется с определенным контроллером. Например, представьте, что вы вводите следующий URL-адрес в адресной строке браузера:
http://localhost/Product/Index/3
В этом случае вызывается контроллер с именем ProductController. ProductController отвечает за создание ответа на запрос браузера. Например, контроллер может возвращать определенное представление в браузер или перенаправлять пользователя на другой контроллер.
В листинге 1 содержится простой контроллер с именем ProductController.
Листинг1. Controllers\ProductController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
namespace MvcApplication1.Controllers
{
public class ProductController : Controller
{
//
// GET: /Products/
public ActionResult Index()
{
// Add action logic here
return View();
}
}
}
Как видно из листинга 1, контроллер — это просто класс (класс Visual Basic .NET или C#). Контроллер — это класс, производный от базового класса System.Web.Mvc.Controller. Так как контроллер наследуется от этого базового класса, контроллер бесплатно наследует несколько полезных методов (мы обсудим эти методы в данный момент).
Основные сведения о действиях контроллера
Контроллер предоставляет действия контроллера. Действие — это метод контроллера, который вызывается при вводе определенного URL-адреса в адресной строке браузера. Например, представьте, что вы запрашиваете следующий URL-адрес:
http://localhost/Product/Index/3
В этом случае метод Index() вызывается для класса ProductController. Метод Index() является примером действия контроллера.
Действие контроллера должно быть открытым методом класса контроллера. Методы C# по умолчанию являются частными методами. Учтите, что любой открытый метод, добавляемый в класс контроллера, автоматически предоставляется в качестве действия контроллера (необходимо быть осторожным, так как действие контроллера может вызвать любой пользователь вселенной, просто введя правильный URL-адрес в адресной строке браузера).
Существуют некоторые дополнительные требования, которые должны быть выполнены действием контроллера. Метод, используемый в качестве действия контроллера, не может быть перегружен. Кроме того, действие контроллера не может быть статическим методом. Кроме этого, вы можете использовать практически любой метод в качестве действия контроллера.
Основные сведения о результатах действий
Действие контроллера возвращает то, что называется результатом действия. Результат действия — это то, что действие контроллера возвращает в ответ на запрос браузера.
Платформа ASP.NET MVC поддерживает несколько типов результатов действий, в том числе:
- ViewResult — представляет HTML и разметку.
- EmptyResult — не представляет результата.
- RedirectResult — представляет перенаправление на новый URL-адрес.
- JsonResult — представляет результат нотации объектов JavaScript, который можно использовать в приложении AJAX.
- JavaScriptResult — представляет скрипт JavaScript.
- ContentResult — представляет текстовый результат.
- FileContentResult — представляет скачиваемый файл (с двоичным содержимым).
- FilePathResult — представляет скачиваемый файл (с путем).
- FileStreamResult — представляет скачиваемый файл (с потоком файлов).
Все эти результаты действия наследуются от базового класса ActionResult.
В большинстве случаев действие контроллера возвращает viewResult. Например, действие контроллера индекса в листинге 2 возвращает viewResult.
Листинг 2. Controllers\BookController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
namespace MvcApplication1.Controllers
{
public class BookController : Controller
{
public ActionResult Index()
{
// Add action logic here
return View();
}
}
}
Когда действие возвращает ViewResult, HTML возвращается в браузер. Метод Index() в листинге 2 возвращает в браузер представление с именем Index.
Обратите внимание, что действие Index() в листинге 2 не возвращает viewResult(). Вместо этого вызывается метод View() базового класса Controller. Как правило, результат действия не возвращается напрямую. Вместо этого вызывается один из следующих методов базового класса Controller:
- View — возвращает результат действия ViewResult.
- Redirect — возвращает результат действия RedirectResult.
- RedirectToAction — возвращает результат действия RedirectToRouteResult.
- RedirectToRoute — возвращает результат действия RedirectToRouteResult.
- Json — возвращает результат действия JsonResult.
- JavaScriptResult — возвращает javaScriptResult.
- Content — возвращает результат действия ContentResult.
- Файл — возвращает значение FileContentResult, FilePathResult или FileStreamResult в зависимости от параметров, переданных методу.
Таким образом, если вы хотите вернуть представление в браузер, вызовите метод View(). Если вы хотите перенаправить пользователя с одного действия контроллера на другое, вызовите метод RedirectToAction(). Например, действие Details() в листинге 3 либо отображает представление, либо перенаправляет пользователя на действие Index() в зависимости от того, имеет ли параметр Id значение.
Листинг 3. CustomerController.cs
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
public class CustomerController : Controller
{
public ActionResult Details(int? id)
{
if (!id.HasValue)
return RedirectToAction("Index");
return View();
}
public ActionResult Index()
{
return View();
}
}
}
Результат действия ContentResult является особенным. Результат действия ContentResult можно использовать для возврата результата действия в виде обычного текста. Например, метод Index() в листинге 4 возвращает сообщение в виде обычного текста, а не в формате HTML.
Листинг 4. Controllers\StatusController.cs
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
public class StatusController : Controller
{
public ActionResult Index()
{
return Content("Hello World!");
}
}
}
При вызове действия StatusController.Index() представление не возвращается. Вместо этого необработанный текст "Hello World!" возвращается в браузер.
Если действие контроллера возвращает результат, который не является результатом действия, например дату или целое число, то результат автоматически упаковывается в ContentResult. Например, при вызове действия Index() объекта WorkController в листинге 5 дата автоматически возвращается как ContentResult.
Листинг 5. Файл WorkController.cs
using System;
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
public class WorkController : Controller
{
public DateTime Index()
{
return DateTime.Now;
}
}
}
Действие Index() в листинге 5 возвращает объект DateTime. Платформа ASP.NET MVC преобразует объект DateTime в строку и автоматически заключает значение DateTime в ContentResult. Браузер получает дату и время в виде обычного текста.
Итоги
Цель этого руководства состояла в том, чтобы ознакомиться с основными понятиями ASP.NET контроллеров MVC, действий контроллеров и результатов действий контроллера. В первом разделе вы узнали, как добавлять новые контроллеры в проект MVC ASP.NET. Затем вы узнали, как открытые методы контроллера предоставляются вселенной в качестве действий контроллера. Наконец, мы рассмотрели различные типы результатов действий, которые могут быть возвращены действием контроллера. В частности, мы обсудили, как вернуть действия ViewResult, RedirectToActionResult и ContentResult из действия контроллера.