Обзор ASP.NET Core MVC

Steve Smith

ASP.NET Core MVC - это богатый фреймворк для создания веб приложений и API с помощью паттерна Model-View-Controller.

Что такое MVC паттерн?

Архитектурный паттерн Model-View-Controller (MVC) делит приложение на три основные группы компонентов: Models (модели), Views (представления) и Controllers (контроллеры). Этот паттерн помогает достичь разделения ответственности. С помощью этого паттерна пользовательские запросы передаются контроллеру, который отвечает за работу с моделью для получения результата запроса. Затем контроллер выбирает представление, чтобы отобразить результат, и передает ему из модели необходимые данные.

На следующем изображении показаны три основных компонента и их взаимосвязь:

../_images/mvc.png

Разделение ответственности делает приложение более простым, поскольку нам легче кодировать, отлаживать и тестировать компонент (модель, представление или контроллер), который делает какую-то одну работу (и следует принципу единственной обязанности). Нам довольно сложно обновлять, тестировать и отлаживать код, в котором присутствуют зависимости, общие для двух или трех этих компонентов. Например, логика UI, как правило, меняется чаще, чем бизнес логика. Если код представления и бизнес логика объединены в один объект, вам необходимо менять объект, содержащий бизнес логику каждый раз, когда вы вносите изменения в UI. Скорее всего, тогда у вас появятся новые ошибки и вам потребуется заново тестировать всю бизнес логику, даже после малейшего изменения пользовательского интерфейса.

Примечание

И представление, и контроллер зависят от модели. А вот модель не зависит ни от представления, ни от контроллера. Это одно из ключевых преимуществ разделения ответственности. Это дает возможность создавать и тестировать модель независимо от визуального представления.

За что отвечает модель

Модель в MVC приложении представляет состояние приложения и любую бизнес логику и операции, которые оно должно выполнить. Бизнес логика и любая логика, касающаяся состояния приложения, должны быть инкапсулированы в модели. Строго типизированные представления обычно используют типы ViewModel, которые содержат данные для отображения в этом представлении; контроллер создаст и заполнит эти экземпляры ViewModel из модели.

Примечание

Есть много способов организовать модель в приложении, которое использует архитектурный паттерн MVC. См. различные типы моделей.

За что отвечает представление

Представления отвечают за отображение контекста в пользовательском интерфейсе. Они используют движок представления Razor, чтобы включить .NET код в HTML разметку. В представлениях должно быть по минимуму логики, и эта логика должна касаться отображаемого контента. Если вам нужно внести большой кусок логики в файлы представлений, чтобы отобразить данные из сложной модели, используйте компонент представления, ViewModel или шаблон, чтобы упростить представление.

За что отвечает контроллер

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

Примечание

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

Совет

Если вы видите, что методы действия контроллеров часто проделывают один и тот же вид работы, последуйте принципу “не повторяйся” - Don’t Repeat Yourself и переместите эти общие действия в фильтры.

Что такое ASP.NET Core MVC

ASP.NET Core MVC - это легкий фреймворк с открытым исходным кодом, оптимизированный для работы с ASP.NET Core.

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

Функционал

ASP.NET Core MVC includes the following features:

Роутинг

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

Роутинг, основанный на соглашении позволяет глобально определить те форматы URL, которые принимает ваше приложение, и определяет, как эти форматы согласуются с конкретными методами действия контроллера. После получения входящего запроса механизм роутинга парсит URL, связывает его с одним из определенных URL форматов, а затем вызывает подходящий метод действия контроллера.

routes.MapRoute(name: "Default", template: "{controller=Home}/{action=Index}/{id?}");

Атрибутивный роутинг позволяет указать роутовую информацию, передав контроллерам и методам действия атрибуты, которые определяют роуты приложения. Это обозначает, что определения располагаются рядом с контроллером и действиями, с которыми они связаны.

[Route("api/[controller]")]
public class ProductsController : Controller
{
  [HttpGet("{id}")]
  public IActionResult GetProduct(int id)
  {
    ...
  }
}

Связывание моделей

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

public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null) { ... }

Валидация моделей

ASP.NET Core MVC поддерживает валидацию, присваивая объекту модели атрибуты валидации DataAnnotations. С помощью атрибутов валидации проверка происходит со стороны клиента, прежде чем значения будут отправлены на сервер, а затем проверка происходит со стороны сервера, прежде чем будет вызван метод действия контроллера.

using System.ComponentModel.DataAnnotations;
public class LoginViewModel
{
    [Required]
    [EmailAddress]
    public string Email { get; set; }

    [Required]
    [DataType(DataType.Password)]
    public string Password { get; set; }

    [Display(Name = "Remember me?")]
    public bool RememberMe { get; set; }
}

Действие контроллера:

public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
{
    if (ModelState.IsValid)
    {
      // work with the model
    }
    // If we got this far, something failed, redisplay form
    return View(model);
}

Фреймворк обработает валидируемые данные запроса и со стороны клиента, и со стороны сервера. Логика валидации добавляется отображаемым представлениям в виде аннотаций и реализуется в браузере с помощью валидации jQuery.

Внедрение зависимостей

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

В приложении также может присутствовать внедрение зависимостей в файлы представлений, это реализуется с помощью директивы @inject:

@inject SomeService ServiceName
<!DOCTYPE html>
<html>
<head>
  <title>@ServiceName.GetTitle</title>
</head>
<body>
  <h1>@ServiceName.GetTitle</h1>
</body>
</html>

Фильтры

Фильтры помогают разработчикам инкапсулировать такие вещи как обработка ошибок или авторизация. Фильтры запускают для методов действий пользовательскую “до” и “после” обработку, и их можно настроить так, чтобы они запускались в конкретной точке в потоке выполнения запроса. Фильтры можно применять к контроллерам или методам действий в виде атрибутов (либо их можно запускать глобально). Некоторые фильтры (еапример, Authorize) включены во фреймворк.

    [Authorize]
    public class AccountController : Controller
    {

Области

Области позволяют разделить большое ASP.NET Core MVC приложение на функциональные группы. Область - это эффективная MVC структура внутри приложения. В MVC проекте логические компоненты как модели, контроллеры и представления хранятся в различных папках, и MVC использует соглашения по именованиям, чтобы связать эти компоненты. Большое приложение можно разделить на отдельные высокоуровневые функциональные области. Например, есть приложение по электронной коммерции со счетами, поиском, выписками и так далее. Тогда каждая область может иметь свои логически обусловленные контроллеры, модели и представления.

Веб API

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

Фреймворк поддерживает согласование контента HTTP со встроенным форматированием данных, как JSON или XML. Вы можете написать пользовательские механизмы форматирования, если хотите поддерживать свои собственные форматы.

Используйте генерирование ссылок, чтобы работать с гипермедиа. Просто включите поддержку CORS, и ваши веб API будут доступны нескольким приложениям.

Тестируемость

Поскольку фреймворк использует интерфейсы и внедрение зависимостей, созданные с его помощью приложения очень легко тестировать. Это касается и модульного, и интеграционного тестирования. Для второго во фреймворк включены такие функции как TestHost и InMemory провайдер для Entity Framework. См. тестирование логики контроллера.

Движок представления Razor

В ASP.NET Core MVC представлениях для отображения используется движок представления Razor. Razor - это компактный, выразительный язык разметки шаблонов для определения представлений, использующий встроенный C# код. Razor используется для динамического генерирования веб контента на сервере. Вы можете смешивать серверный и клиентский код, не загрязняя его.

<ul>
  @for (int i = 0; i < 5; i++) {
    <li>List item @i</li>
  }
</ul>

Используя движок представления Razor, вы можете определить верстку, частичные представления и заменяемые разделы.

Строго типизированные представления

Razor представления в MVC могут быть строго типизированными. Контроллер может передать представлению строго типизированную модель, и тогда будет проверяться тип представления, а также включаться поддержка IntelliSense.

Например, следующее представление определяет модель типа IEnumerable<Product>:

@model IEnumerable<Product>
<ul>
    @foreach (Product p in Model)
    {
        <li>@p.Name</li>
    }
</ul>

Тег-хелперы

Тег-хелперы позволяют серверному коду принимать участие в создании и отображении HTML элементов в Razor файлах. Тег-хелперы можно использовать для определения пользовательских тегов (например, <environment>) или для изменения поведения существующих тегов (например, <label>). Тег-хелперы привязываются к конкретным элементам, основываясь на имени элемента и его атрибутах. Они дают преимущества отображения со стороны сервера, сохраняя возможности HTML редактирования.

Для общих задач существует множество встроенных тег-хелперов - для создания форм, ссылок, загрузки активов и так далее - и еще больше доступно в открытых GitHub репозиториях и в виде NuGet пакетов. Тег-хелперы работают с HTML элементами, основываясь на имени элемента, имени атрибута или родительском теге. Например, встроенный LinkTagHelper можно использовать для создания ссылки к методу действия``Login`` контроллера AccountsController:

<p>
    Thank you for confirming your email.
    Please <a asp-controller="Account" asp-action="Login">Click here to Log in</a>.
</p>

EnvironmentTagHelper можно использовать для включения в представление различных скриптов (например, сырых или минимизированных), основываясь на среде, как то Development, Staring или Production:

<environment names="Development">
    <script src="~/lib/jquery/dist/jquery.js"></script>
</environment>
<environment names="Staging,Production">
    <script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-2.1.4.min.js"
            asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
            asp-fallback-test="window.jQuery">
    </script>
</environment>

Компоненты представления

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

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