Поделиться через


Общие сведения о контроллерах в 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 поддерживает несколько типов результатов действий, в том числе:

  1. ViewResult — представляет HTML и разметку.
  2. EmptyResult — не представляет результата.
  3. RedirectResult — представляет перенаправление на новый URL-адрес.
  4. JsonResult — представляет результат нотации объектов JavaScript, который можно использовать в приложении AJAX.
  5. JavaScriptResult — представляет скрипт JavaScript.
  6. ContentResult — представляет текстовый результат.
  7. FileContentResult — представляет скачиваемый файл (с двоичным содержимым).
  8. FilePathResult — представляет скачиваемый файл (с путем).
  9. 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:

  1. View — возвращает результат действия ViewResult.
  2. Redirect — возвращает результат действия RedirectResult.
  3. RedirectToAction — возвращает результат действия RedirectToRouteResult.
  4. RedirectToRoute — возвращает результат действия RedirectToRouteResult.
  5. Json — возвращает результат действия JsonResult.
  6. JavaScriptResult — возвращает javaScriptResult.
  7. Content — возвращает результат действия ContentResult.
  8. Файл — возвращает значение 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 из действия контроллера.