Общие сведения ASP.NET Core MVCOverview of ASP.NET Core MVC

Автор: Стив Смит (Steve Smith)By Steve Smith

ASP.NET MVC является многофункциональной платформой для создания веб-приложений и API-интерфейсов с помощью структуры проектирования Model-View-Controller.ASP.NET Core MVC is a rich framework for building web apps and APIs using the Model-View-Controller design pattern.

Что собой представляет структура MVC?What is the MVC pattern?

Структура архитектуры MVC разделяет приложение на три основных группы компонентов: модели, представлении и контроллеры.The Model-View-Controller (MVC) architectural pattern separates an application into three main groups of components: Models, Views, and Controllers. Это позволяет реализовать принципы разделения задач.This pattern helps to achieve separation of concerns. Согласно этой структуре запросы пользователей направляются в контроллер, который отвечает за работу с моделью для выполнения действий пользователей и (или) получение результатов запросов.Using this pattern, user requests are routed to a Controller which is responsible for working with the Model to perform user actions and/or retrieve results of queries. Контроллер выбирает представление для отображения пользователю со всеми необходимыми данными модели.The Controller chooses the View to display to the user, and provides it with any Model data it requires.

На следующей схеме показаны три основных компонента и существующие между ними связи.The following diagram shows the three main components and which ones reference the others:

Структура MVC

Такое распределение обязанностей позволяет масштабировать приложение в контексте сложности, так как проще писать код, выполнять отладку и тестирование компонента (модели, представления или контроллера) с одним заданием.This delineation of responsibilities helps you scale the application in terms of complexity because it's easier to code, debug, and test something (model, view, or controller) that has a single job. Гораздо труднее обновлять, тестировать и отлаживать код, зависимости которого находятся в двух или трех этих областях.It's more difficult to update, test, and debug code that has dependencies spread across two or more of these three areas. Например, логика пользовательского интерфейса, как правило, подвергается изменениям чаще, чем бизнес-логика.For example, user interface logic tends to change more frequently than business logic. Если код представления и бизнес-логика объединены в один объект, содержащий бизнес-логику, объект необходимо изменять при каждом обновлении пользовательского интерфейса.If presentation code and business logic are combined in a single object, an object containing business logic must be modified every time the user interface is changed. Это часто приводит к возникновению ошибок и необходимости повторно тестировать бизнес-логику после каждого незначительного изменения пользовательского интерфейса.This often introduces errors and requires the retesting of business logic after every minimal user interface change.

Примечание

Представление и контроллер зависят от модели.Both the view and the controller depend on the model. Однако сама модель не зависит ни от контроллера, ни от представления.However, the model depends on neither the view nor the controller. Это является одним из ключевых преимуществ разделения.This is one of the key benefits of the separation. Такое разделение позволяет создавать и тестировать модели независимо от их визуального представления.This separation allows the model to be built and tested independent of the visual presentation.

Функции моделиModel Responsibilities

Модель в приложении MVC представляет состояние приложения и бизнес-логику или операций, которые должны в нем выполняться.The Model in an MVC application represents the state of the application and any business logic or operations that should be performed by it. Бизнес-логика должна быть включена в состав модели вместе с логикой реализации для сохранения состояния приложения.Business logic should be encapsulated in the model, along with any implementation logic for persisting the state of the application. Как правило, строго типизированные представления используют типы ViewModel, предназначенные для хранения данных, отображаемых в этом представлении.Strongly-typed views typically use ViewModel types designed to contain the data to display on that view. Контроллер создает и заполняет эти экземпляры ViewModel из модели.The controller creates and populates these ViewModel instances from the model.

Функции представленияView Responsibilities

Представления отвечают за представление содержимого через пользовательский интерфейс.Views are responsible for presenting content through the user interface. Они используют Razor обработчик представлений для внедрения кода .NET в разметку HTML.They use the Razor view engine to embed .NET code in HTML markup. Представления должны иметь минимальную логику, которая должна быть связана с представлением содержимого.There should be minimal logic within views, and any logic in them should relate to presenting content. Если есть необходимость выполнять большую часть логики в представлении для отображения данных из сложной модели, рекомендуется воспользоваться компонентом представления, ViewModel или шаблоном представления, позволяющими упростить представление.If you find the need to perform a great deal of logic in view files in order to display data from a complex model, consider using a View Component, ViewModel, or view template to simplify the view.

Функции контроллераController Responsibilities

Контроллеры — это компоненты для управления взаимодействием с пользователем, работы с моделью и выбора представления для отображения.Controllers are the components that handle user interaction, work with the model, and ultimately select a view to render. В приложении MVC представление служит только для отображения информации. Обработку введенных данных, формирование ответа и взаимодействие с пользователем обеспечивает контроллер.In an MVC application, the view only displays information; the controller handles and responds to user input and interaction. В структуре MVC контроллер является начальной отправной точкой и отвечает за выбор рабочих типов моделей и отображаемых представлений (именно этим объясняется его название — он контролирует, каким образом приложение отвечает на конкретный запрос).In the MVC pattern, the controller is the initial entry point, and is responsible for selecting which model types to work with and which view to render (hence its name - it controls how the app responds to a given request).

Примечание

Контроллеры не должны быть чересчур сложными из-за слишком большого количества обязанностей.Controllers shouldn't be overly complicated by too many responsibilities. Чтобы не перегружать логику контроллера, перенесите бизнес-логику из контроллера в модель предметной области.To keep controller logic from becoming overly complex, push business logic out of the controller and into the domain model.

Совет

Если ваш контроллер часто выполняет одни и те же виды действий, переместите эти действия в фильтры.If you find that your controller actions frequently perform the same kinds of actions, move these common actions into filters.

Что такое ASP.NET Core MVC?What is ASP.NET Core MVC

ASP.NET Core MVC представляет собой упрощенную, эффективно тестируемую платформу с открытым исходным кодом, оптимизированную для использования с ASP.NET Core.The ASP.NET Core MVC framework is a lightweight, open source, highly testable presentation framework optimized for use with ASP.NET Core.

ASP.NET Core MVC предоставляет основанный на шаблонах способ создания динамических веб-сайтов с четким разделением задач.ASP.NET Core MVC provides a patterns-based way to build dynamic websites that enables a clean separation of concerns. Она обеспечивает полный контроль разметки, поддерживает согласованную с TDD разработку и использует новейшие веб-стандарты.It gives you full control over markup, supports TDD-friendly development and uses the latest web standards.

ФункцииFeatures

К возможностям ASP.NET MVC относятся:ASP.NET Core MVC includes the following:

МаршрутизацияRouting

Платформа ASP.NET Core MVC создана на основе маршрутизации ASP.NET Core — мощного компонента сопоставления URL-адресов, который позволяет создавать приложения с понятными и поддерживающими поиск URL-адресами.ASP.NET Core MVC is built on top of ASP.NET Core's routing, a powerful URL-mapping component that lets you build applications that have comprehensible and searchable URLs. Вы можете определять шаблоны именования URL-адресов приложения, эффективно работающие для оптимизации для поисковых систем (SEO) и для создания ссылок, независимо от способа организации файлов на веб-сервере.This enables you to define your application's URL naming patterns that work well for search engine optimization (SEO) and for link generation, without regard for how the files on your web server are organized. Вы можете определять маршруты с помощью понятного синтаксиса шаблонов маршрутов, который поддерживает ограничения значений маршрутов, значения по умолчанию и необязательные значения.You can define your routes using a convenient route template syntax that supports route value constraints, defaults and optional values.

Маршрутизация на основе соглашения позволяет глобально определять форматы URL-адресов, допустимые для приложения, а также устанавливать, каким образом каждый из этих форматов сопоставляется с конкретным методом действия в определенном контроллере.Convention-based routing enables you to globally define the URL formats that your application accepts and how each of those formats maps to a specific action method on given controller. При поступлении входящего запроса модуль маршрутизации выполняет синтаксический анализ URL-адреса и соотносит его с одним из определенных форматов URL-адресов, а затем вызывает метод действия связанного контроллера.When an incoming request is received, the routing engine parses the URL and matches it to one of the defined URL formats, and then calls the associated controller's action method.

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

Маршрутизация атрибутов используется для указания сведений о маршрутизации путем добавления атрибутов, определяющих маршруты приложения, к контроллерам и действиям.Attribute routing enables you to specify routing information by decorating your controllers and actions with attributes that define your application's routes. Это означает, что определения маршрутов помещаются рядом с контроллером и действием, с которым они связаны.This means that your route definitions are placed next to the controller and action with which they're associated.

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

Привязка моделиModel binding

Привязка модели в ASP.NET Core MVC преобразует данные запроса клиента (значения форм, данные маршрута, параметры строки запроса, заголовки HTTP) в объекты, которые может обрабатывать контроллер.ASP.NET Core MVC model binding converts client request data (form values, route data, query string parameters, HTTP headers) into objects that the controller can handle. В результате логике контроллера не требуется определять данные входящего запроса — данные просто доступны в виде параметров для методов действий.As a result, your controller logic doesn't have to do the work of figuring out the incoming request data; it simply has the data as parameters to its action methods.

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

Проверка моделиModel validation

ASP.NET MVC поддерживает возможность проверки, дополняя модель объекта атрибутами проверки заметок к данным.ASP.NET Core MVC supports validation by decorating your model object with data annotation validation attributes. Атрибуты проверки проверяются на стороне клиента до размещения значений на сервере, а также на сервере перед выполнением действия контроллера.The validation attributes are checked on the client side before values are posted to the server, as well as on the server before the controller action is called.

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; }
}

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

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

Платформа обрабатывает проверку данных запроса на клиенте и на сервере.The framework handles validating request data both on the client and on the server. Логика проверки, указанная в типах модели, добавляется в готовые для просмотра представления в виде ненавязчивых заметок и реализуется в браузере с помощью подключаемого модуля jQuery Validation.Validation logic specified on model types is added to the rendered views as unobtrusive annotations and is enforced in the browser with jQuery Validation.

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

ASP.NET Core имеет встроенную поддержку внедрения зависимостей (DI).ASP.NET Core has built-in support for dependency injection (DI). В ASP.NET MVC Core контроллеры могут запрашивать необходимые служб через свои конструкторы, предоставляя им возможность следовать принципу явных зависимостей.In ASP.NET Core MVC, controllers can request needed services through their constructors, allowing them to follow the Explicit Dependencies Principle.

Кроме того, приложение может использовать внедрение зависимостей в файлы представления с помощью директивы @inject:Your app can also use dependency injection in view files, using the @inject directive:

@inject SomeService ServiceName

<!DOCTYPE html>
<html lang="en">
<head>
    <title>@ServiceName.GetTitle</title>
</head>
<body>
    <h1>@ServiceName.GetTitle</h1>
</body>
</html>

ФильтрыFilters

Фильтры помогают разработчикам решать общие задачи, такие как обработка исключений или авторизация.Filters help developers encapsulate cross-cutting concerns, like exception handling or authorization. Фильтры активируют пользовательскую логику предварительной и завершающей обработки для методов действий и могут быть настроены для запуска в определенные моменты в конвейерном выполнении определенного запроса.Filters enable running custom pre- and post-processing logic for action methods, and can be configured to run at certain points within the execution pipeline for a given request. Фильтры могут применяться к контроллерам или действиям в виде атрибутов (или могут выполняться глобально).Filters can be applied to controllers or actions as attributes (or can be run globally). В состав платформы входит несколько фильтров (например, Authorize).Several filters (such as Authorize) are included in the framework. [Authorize] является атрибутом, который используется для создания фильтров авторизации MVC.[Authorize] is the attribute that is used to create MVC authorization filters.

[Authorize]
public class AccountController : Controller

ОбластиAreas

Области позволяют секционировать крупные ASP.NET Core веб-приложения MVC в более мелкие функциональные группы.Areas provide a way to partition a large ASP.NET Core MVC Web app into smaller functional groupings. Область является структурой MVC внутри приложения.An area is an MVC structure inside an application. В проекте MVC логические компоненты, такие как модель, контроллер и представление, находятся в разных папках, и для создания связи между этими компонентами MVC использует соглашения об именовании.In an MVC project, logical components like Model, Controller, and View are kept in different folders, and MVC uses naming conventions to create the relationship between these components. Крупное приложение может быть целесообразно разделить на отдельные высокоуровневые области функциональности.For a large app, it may be advantageous to partition the app into separate high level areas of functionality. Например, приложение электронной коммерции с несколькими подразделениями, например извлечение, выставление счетов и поиск и т. д. Каждое из этих устройств имеет собственные представления логических компонентов, контроллеры и модели.For instance, an e-commerce app with multiple business units, such as checkout, billing, and search etc. Each of these units have their own logical component views, controllers, and models.

Веб-APIWeb APIs

Помимо того, что ASP.NET Core MV прекрасно подходит для создания веб-сайтов, эта платформа располагает мощной поддержкой для построения веб-API.In addition to being a great platform for building web sites, ASP.NET Core MVC has great support for building Web APIs. Создавайте службы, доступные для широкого круга клиентов, включая браузеры и мобильные устройства.You can build services that reach a broad range of clients including browsers and mobile devices.

Платформа поддерживает согласования содержимого HTTP со встроенной поддержкой для форматирования данных в виде JSON или XML.The framework includes support for HTTP content-negotiation with built-in support to format data as JSON or XML. Пишите пользовательские модули форматирования для добавления поддержки собственных форматов.Write custom formatters to add support for your own formats.

Используйте функции создания ссылок для поддержки гипермедиа.Use link generation to enable support for hypermedia. Легко включайте поддержку общего доступа к ресурсам независимо от источника (CORS) для совместного использования веб-API в нескольких веб-приложениях.Easily enable support for cross-origin resource sharing (CORS) so that your Web APIs can be shared across multiple Web applications.

ТестированиеTestability

Благодаря используемым интерфейсам и внедрению зависимостей платформа хорошо подходит для модульного тестирования. Кроме того, с помощью таких компонентов, как TestHost и поставщик InMemory для Entity Framework, можно быстро и просто выполнять интеграционные тесты.The framework's use of interfaces and dependency injection make it well-suited to unit testing, and the framework includes features (like a TestHost and InMemory provider for Entity Framework) that make integration tests quick and easy as well. Узнайте больше о тестировании логики контроллеров.Learn more about how to test controller logic.

RazorПросмотреть подсистемуRazor view engine

ASP.NET Core представления MVC используют Razor обработчик представлений для отображения представлений.ASP.NET Core MVC views use the Razor view engine to render views. Razor— Это компактный, выразительный и жидкий язык разметки шаблонов для определения представлений с помощью встраиваемого кода C#.Razor is a compact, expressive and fluid template markup language for defining views using embedded C# code. Razorиспользуется для динамического создания веб-содержимого на сервере.Razor is used to dynamically generate web content on the server. Серверный код можно полностью комбинировать с содержимым и кодом на стороне клиента.You can cleanly mix server code with client side content and code.

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

С помощью Razor обработчика представлений можно определять макеты, частичные представления и заменяемые разделы.Using the Razor view engine you can define layouts, partial views and replaceable sections.

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

Razorпредставления в MVC могут быть строго типизированы на основе модели.Razor views in MVC can be strongly typed based on your model. Контроллеры передают строго типизированную модель в представления для поддержки в них IntelliSense и проверки типов.Controllers can pass a strongly typed model to views enabling your views to have type checking and IntelliSense support.

Например, следующее представление отображает модель типа IEnumerable<Product>:For example, the following view renders a model of type IEnumerable<Product>:

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

Вспомогательные функции теговTag Helpers

Вспомогательные функции тегов позволяют коду на стороне сервера принимать участие в создании и ОТРИСОВКЕ HTML-элементов в Razor файлах.Tag Helpers enable server side code to participate in creating and rendering HTML elements in Razor files. Вспомогательные функции тегов используются для определения настраиваемых тегов (например, <environment>) или для изменения поведения существующих тегов (например, <label>).You can use tag helpers to define custom tags (for example, <environment>) or to modify the behavior of existing tags (for example, <label>). Вспомогательные функции тегов привязываются к определенным элементам на основе имени элемента и его атрибутов.Tag Helpers bind to specific elements based on the element name and its attributes. Они предоставляют преимущества отрисовки на стороне сервера, сохраняя при этом возможности редактирования HTML.They provide the benefits of server-side rendering while still preserving an HTML editing experience.

Существует множество встроенных вспомогательных функций тегов для общих задач — например, для создания форм, ссылок, загрузки ресурсов и т. д. Кроме того, огромное количество функций доступно в общедоступных репозиториях GitHub и в качестве пакетов NuGet.There are many built-in Tag Helpers for common tasks - such as creating forms, links, loading assets and more - and even more available in public GitHub repositories and as NuGet packages. Вспомогательные функции тегов разрабатываются на C# и предназначены для HTML-элементов на основе имени элемента, имени атрибута или родительского тега.Tag Helpers are authored in C#, and they target HTML elements based on element name, attribute name, or parent tag. Например, встроенную функцию LinkTagHelper можно использовать для создания ссылки на действие AccountsController для Login:For example, the built-in LinkTagHelper can be used to create a link to the Login action of the AccountsController:

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

С помощью EnvironmentTagHelper можно включать в приложения различные сценарии (например, необработанные или минифицированные) для конкретной среды выполнения (разработки, промежуточной или производственной):The EnvironmentTagHelper can be used to include different scripts in your views (for example, raw or minified) based on the runtime environment, such as Development, Staging, or 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>

Вспомогательные функции тегов обеспечивают удобный для HTML процесс разработки и расширенную среду IntelliSense для создания HTML и Razor разметки.Tag Helpers provide an HTML-friendly development experience and a rich IntelliSense environment for creating HTML and Razor markup. Большинство встроенных вспомогательных функций тегов работают с существующими HTML-элементами и предоставляют для них атрибуты на стороне сервера.Most of the built-in Tag Helpers target existing HTML elements and provide server-side attributes for the element.

Компоненты представленийView Components

Компоненты представлений позволяют упаковывать логику отрисовки и повторно использовать ее в приложении.View Components allow you to package rendering logic and reuse it throughout the application. Они аналогичны частичным представлениям, но имеют связанную логику.They're similar to partial views, but with associated logic.

Совместимая версияCompatibility version

Метод SetCompatibilityVersion позволяет приложению принимать или отклонять потенциально критические изменения в поведении, появившиеся в ASP.NET Core MVC 2.1 или более поздних версий.The SetCompatibilityVersion method allows an app to opt-in or opt-out of potentially breaking behavior changes introduced in ASP.NET Core MVC 2.1 or later.

Для получения дополнительной информации см. Совместимая версия для ASP.NET Core MVC.For more information, see Совместимая версия для ASP.NET Core MVC.

Дополнительные ресурсыAdditional resources