Контроллеры, методы действия и результаты действий

Steve Smith

Методы действия и результаты действий являются фундаментальной частью разработки с помощью ASP.NET MVC.

Что такое контроллер

В ASP.NET MVC контроллер используется для определения и объединения набора методов действий. Действие (или метод действия) - это метод контроллера, который обрабатывает входящие запросы. Контроллеры логически объединяют схожие действия, когда совместно применяются общие наборы правил (например, роутинг, кэширование, авторизация). Входящие запросы передаются методу действия с помощью роутинга.

В ASP.NET Core MVC контроллер может быть экземплярным классом, который заканчивается на “Controller”, или может наследоваться от класса, который заканчивается на “Controller”. Контроллеры следуют принципу явных зависимостей и запрашивают все зависимости, которые требуются их действиям, через конструктор с помощью внедрения зависимостей.

По умолчанию классы контроллеров:
  • находятся в папке “Controllers”
  • наследуются от Microsoft.AspNet.Mvc.Controller

Эти два соглашения не обязательны.

В паттерне Model-View-Controller контроллер отвечает за начальную обработку запроса и создание экземпляра модели. Обычно бизнес логика реализуется внутри модели.

Примечание

Модель должна быть Plain Old CLR Object (POCO), а не DbContext или типом, связанным с БД.

Контроллер принимает результат обработки модели (если таковой есть) и возвращает соответствующее представление наряду со связанными с ним данными. См.: Обзор ASP.NET Core MVC и Начинаем работу с ASP.NET Core MVC и Visual Studio.

Совет

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

Определение методов действий

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

Предупреждение

Для методов действия, которые принимают параметры, свойство ModelState.IsValid должно быть установлено на true.

Действия должны содержать логику для приема входящих запросов. Бизнес логика обычно представлена в виде сервисов, к которым контроллер получает доступ через внедрение зависимостей. Затем действия передают результат состоянию приложения.

Действия могут возвращать все, что угодно, но обычно они возвращают экземпляр IActionResult (или Task<IActionResult> для асинхронных методов). Методы действия также отвечают за то, каким будет тип ответа.

Вспомогательные методы контроллера

Обычно большинство разработчиков хотят, чтобы контроллеры наследовались от базового класса Controller. Тогда контроллеры получают доступ ко многим свойствам и полезным методам, включая следующие вспомогательные методы, которые поддерживают возвращение различных ответов:

представления
Возвращают представления, которые использует модель для представления HTML. Например: return View(customer);
Коды HTTP статуса
Возвращают коды HTTP статуса. Например: return BadRequest();
Форматированные ответы
Возвращают Json или что-то схожее для форматирования объекта. Например: return Json(customer);
Ответы по статусу
Вместо возвращения объекта действие возвращает ответ по статусу (используя Ok, Created, CreatedAtRoute или CreatedAtAction). Например: return Ok(); или return CreatedAtRoute("routename",values,newobject");
Перенаправление
Делает перенаправление к другому действию (используя Redirect,``LocalRedirect``,``RedirectToAction`` или RedirectToRoute). Например: return RedirectToAction("Complete", new {id = 123});

Кроме того, действие может просто возвращать объект. В данном случае объект будет отформатирован, основываясь на запросе клиента. См. Formatting Response Data.

“Разделение труда”

В большинстве приложений действия будут иногда совместно работать над отдельными частями процесса. Например, какая-то часть приложения может быть доступна только для аутентифицированных пользователей либо вы можете использовать кэш. Если вы хотите реализовать некоторую логику до или после того, как запустится некий метод действия, то можете использовать filter. Вы можете значительно уменьшить методы, используя Filters для обработки таких вещей. Это поможет избежать дублирования внутри действий, позволяя им следовать принципу Don’t Repeat Yourself (DRY).

В случае авторизации или аутентификации вы можете применить атрибут Authorize для любых действий, которым он нужен. Если в добавите его в контроллер, то он будет применяться ко всем действиям внутри этого контроллера. Соответствующий фильтр будет применяться к любому запросу для этого действия. Некоторые атрибуты можно применять и на уровне действия, и на уровне контроллера. См.: Filters и 🔧 Authorization Filters.

Кроме того, в можете использовать:

Примечание

Часто в MVC приложениях можно использовать фильтры. А кроме того, альтернативой этому является пользовательское связующее ПО.

Поделись хорошей новостью с друзьями!
Следи за новостями!