Vue d’ensemble d’ASP.NET Core MVCOverview of ASP.NET Core MVC

Par Steve SmithBy Steve Smith

ASP.NET Core MVC est un puissant framework qui vous permet de générer des applications web et des API à l’aide du modèle de conception Model-View-Controller.ASP.NET Core MVC is a rich framework for building web apps and APIs using the Model-View-Controller design pattern.

Qu’est-ce que le modèle MVC ?What is the MVC pattern?

Le modèle d’architecture Model-View-Controller (MVC) sépare une application en trois groupes de composants principaux : les modèles, les vues et les contrôleurs.The Model-View-Controller (MVC) architectural pattern separates an application into three main groups of components: Models, Views, and Controllers. Ce modèle permet d’effectuer la séparation des préoccupations.This pattern helps to achieve separation of concerns. En utilisant ce modèle, les demandes de l’utilisateur sont acheminées vers un contrôleur qui a la responsabilité de fonctionner avec le modèle pour effectuer des actions de l’utilisateur et/ou de récupérer les résultats de requêtes.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. Le contrôleur choisit la vue à afficher à l’utilisateur et lui fournit toutes les données de modèle dont elle a besoin.The Controller chooses the View to display to the user, and provides it with any Model data it requires.

Le diagramme suivant montre les trois composants principaux et leurs relations entre eux :The following diagram shows the three main components and which ones reference the others:

Modèle MVC

Cette délimitation des responsabilités vous aide à mettre à l’échelle la complexité de l’application, car il est plus facile de coder, déboguer et tester une chose (modèle, vue ou contrôleur) qui a un seul travail (et suit le principe de responsabilité unique).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 (and follows the Single Responsibility Principle). Il est plus difficile de mettre à jour, tester et déboguer du code dont les dépendances sont réparties sur deux de ces domaines ou plus.It's more difficult to update, test, and debug code that has dependencies spread across two or more of these three areas. Par exemple, la logique de l’interface utilisateur a tendance à changer plus fréquemment que la logique métier.For example, user interface logic tends to change more frequently than business logic. Si le code de présentation et la logique métier sont combinés en un seul objet, l’objet contenant la logique métier doit être modifié chaque fois que l’interface utilisateur change.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. Cela introduit souvent des erreurs et nécessite de retester la logique métier après chaque changement minimal de l’interface utilisateur.This often introduces errors and requires the retesting of business logic after every minimal user interface change.

Note

La vue et le contrôleur dépendent tous deux du modèle.Both the view and the controller depend on the model. Toutefois, le modèle ne dépend ni de la vue ni du contrôleur.However, the model depends on neither the view nor the controller. Il s’agit de l’un des principaux avantages de la séparation.This is one of the key benefits of the separation. Cette séparation permet de générer et de tester le modèle indépendamment de la présentation visuelle.This separation allows the model to be built and tested independent of the visual presentation.

Responsabilités du modèleModel Responsibilities

Le modèle d’une application MVC représente l’état de l’application, ainsi que la logique métier ou les opérations à effectuer.The Model in an MVC application represents the state of the application and any business logic or operations that should be performed by it. La logique métier doit être encapsulée dans le modèle, ainsi que toute autre logique d’implémentation pour la persistance de l’état de l’application.Business logic should be encapsulated in the model, along with any implementation logic for persisting the state of the application. En général, les vues fortement typées utilisent des types ViewModel conçus pour contenir les données à afficher sur cette vue.Strongly-typed views typically use ViewModel types designed to contain the data to display on that view. Le contrôleur crée et remplit ces instances de ViewModel à partir du modèle.The controller creates and populates these ViewModel instances from the model.

Note

Il existe de nombreuses façons d’organiser le modèle dans une application qui utilise le modèle d'architecture MVC.There are many ways to organize the model in an app that uses the MVC architectural pattern. Pour en savoir plus, consultez les informations sur les différents genres de types de modèle.Learn more about some different kinds of model types.

Responsabilités de la vueView Responsibilities

Les vues sont responsables de la présentation du contenu via l’interface utilisateur.Views are responsible for presenting content through the user interface. Elles utilisent le moteur de vue Razor pour incorporer du code .NET dans les balises HTML.They use the Razor view engine to embed .NET code in HTML markup. Il doit exister une logique minimale dans les vues, et cette logique doit être liée à la présentation du contenu.There should be minimal logic within views, and any logic in them should relate to presenting content. Si vous avez besoin d’exécuter une grande partie de la logique dans les fichiers de vue pour afficher les données d’un modèle complexe, utilisez un composant de vue, ViewModel ou un modèle de vue pour simplifier la vue.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.

Responsabilités du contrôleurController Responsibilities

Les contrôleurs sont des composants qui gèrent l’interaction avec l’utilisateur, fonctionnent avec le modèle et, au final, sélectionnent une vue à afficher.Controllers are the components that handle user interaction, work with the model, and ultimately select a view to render. Dans une application MVC, la vue affiche uniquement des informations ; le contrôleur gère les entrées et interactions des utilisateurs, et y répond.In an MVC application, the view only displays information; the controller handles and responds to user input and interaction. Dans le modèle MVC, le contrôleur est le point d’entrée initial. Il est responsable de la sélection des types de modèle à utiliser et de la vue à afficher (ce qui explique son nom, car il contrôle la manière dont l’application répond à une requête donnée).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).

Note

Vous devez éviter les excès de responsabilités pour ne pas rendre les contrôleurs trop complexes.Controllers shouldn't be overly complicated by too many responsibilities. Pour éviter que la logique du contrôleur ne devienne trop complexe, utilisez le principe de responsabilité unique afin d’envoyer (push) la logique métier hors du contrôleur vers le modèle de domaine.To keep controller logic from becoming overly complex, use the Single Responsibility Principle to push business logic out of the controller and into the domain model.

Conseil

Si vous constatez que le contrôleur effectue souvent les mêmes genres d’action, vous pouvez suivre le principe DRY (Ne vous répétez pas) en plaçant ces actions usuelles dans des filtres.If you find that your controller actions frequently perform the same kinds of actions, you can follow the Don't Repeat Yourself principle by moving these common actions into filters.

Nouveautés d’ASP.NET Core MVCWhat is ASP.NET Core MVC

Le framework ASP.NET Core MVC est un framework de présentation léger, open source et hautement testable, optimisé pour 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 offre un fonctionnement basé sur des patterns pour créer des sites Web dynamiques qui permettent une séparation claire des préoccupations.ASP.NET Core MVC provides a patterns-based way to build dynamic websites that enables a clean separation of concerns. Il vous donne un contrôle total sur le balisage, prend en charge les développements TDD et utilise les standards web les plus récents.It gives you full control over markup, supports TDD-friendly development and uses the latest web standards.

FonctionnalitésFeatures

ASP.NET Core MVC inclut les éléments suivants :ASP.NET Core MVC includes the following:

RoutageRouting

ASP.NET Core MVC est construit sur le routage d'ASP.NET Core, un composant de mappage d’URL puissant qui vous permet de créer des applications ayant des URLs compréhensibles et découvrables.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. Cela vous permet de définir les patterns de noms d’URL de votre application qui fonctionnent bien pour l’optimisation des moteurs de recherche (SEO) et pour la génération de lien, sans tenir compte de la façon dont les fichiers sont organisés sur votre serveur web.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. Vous pouvez définir vos routes à l’aide d’une syntaxe pratique de modèle de routes (route template) qui prend en charge les contraintes de valeur, les valeurs par défaut et les valeurs facultatives de routes.You can define your routes using a convenient route template syntax that supports route value constraints, defaults and optional values.

Le routage basé sur les conventions vous permet de définir globalement les formats d’URL acceptés par votre application, ainsi que le mappage de chacun de ces formats à une méthode d’action spécifique sur un contrôleur donné.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. Quand une requête entrante est reçue, le moteur de routage analyse l’URL et la fait correspondre à l’un des formats d’URL définis, puis il appelle la méthode d’action du contrôleur associé.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?}");

Le routage d’attributs vous permet de spécifier des informations de routage en décorant vos contrôleurs et vos actions avec des attributs qui définissent les routages de votre application.Attribute routing enables you to specify routing information by decorating your controllers and actions with attributes that define your application's routes. Cela signifie que vos définitions de routage sont placées à côté du contrôleur et de l’action auxquels elles sont associées.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)
  {
    ...
  }
}

Liaison de donnéesModel binding

La liaison de modèle ASP.NET Core MVC convertit les données de requête client (les valeurs de formulaire, les données de routage, les paramètres de chaîne de requête, les en-têtes HTTP) en objets que le contrôleur peut traiter.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. Par conséquent, votre logique de contrôleur ne doit pas nécessairement faire le travail d’identifier les données de requête entrante; Il a simplement les données en tant que paramètres dans ses méthodes d’action.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) { ... }

Validation du modèleModel validation

ASP.NET Core MVC prend en charge la validation en décorant votre objet de modèle avec des attributs de validation de données d’annotation.ASP.NET Core MVC supports validation by decorating your model object with data annotation validation attributes. Les attributs de validation sont vérifiés côté client avant que les valeurs ne soient postées sur le serveur, ainsi que sur le serveur avant l’appel de l’action du contrôleur.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; }
}

Action du contrôleur :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);
}

Le framework gère la validation des données de requête à la fois sur le client et sur le serveur.The framework handles validating request data both on the client and on the server. La logique de validation spécifiée pour les types de modèle est ajoutée aux vues affichées en tant qu’annotations discrètes, et est appliquée dans le navigateur à l’aide de la validation jQuery.Validation logic specified on model types is added to the rendered views as unobtrusive annotations and is enforced in the browser with jQuery Validation.

Injection de dépendancesDependency injection

ASP.NET Core offre une prise en charge intégrée de l’injection de dépendances.ASP.NET Core has built-in support for dependency injection (DI). Dans ASP.NET Core MVC, les contrôleurs peuvent demander les services nécessaires via leurs constructeurs, ce qui leur permet de suivre le principe des dépendances explicites.In ASP.NET Core MVC, controllers can request needed services through their constructors, allowing them to follow the Explicit Dependencies Principle.

Votre application peut également utiliser l’injection de dépendances dans les fichiers de vue, à l’aide de la directive @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>

FiltresFilters

Les filtres permettent aux développeurs d’intégrer des problèmes transversaux, par exemple la prise en charge des exceptions ou les autorisations.Filters help developers encapsulate cross-cutting concerns, like exception handling or authorization. Les filtres permettent d’exécuter une logique de prétraitement et de posttraitement personnalisée pour les méthodes d’action. Vous pouvez les configurer pour qu’ils se lancent à certaines étapes du pipeline d’exécution d’une requête donnée.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. Vous pouvez appliquer les filtres aux contrôleurs ou aux actions en tant qu’attributs (ou vous pouvez les exécuter de manière globale).Filters can be applied to controllers or actions as attributes (or can be run globally). Plusieurs filtres (tels que Authorize) sont inclus dans le framework.Several filters (such as Authorize) are included in the framework. [Authorize] est l’attribut qui est utilisé pour créer des filtres d’autorisation MVC.[Authorize] is the attribute that is used to create MVC authorization filters.

[Authorize]
   public class AccountController : Controller
   {

Zones (Areas)Areas

Les zones fournissent un moyen de partitionner une application Web ASP.NET Core MVC volumineuse en regroupements fonctionnels plus petits.Areas provide a way to partition a large ASP.NET Core MVC Web app into smaller functional groupings. Une zone est en réalité une structure MVC à l’intérieur d’une application.An area is an MVC structure inside an application. Dans un projet MVC, les composants logiques tels que les modèles, les contrôleurs et les vues sont conservés dans des dossiers différents et MVC utilise les conventions de nommage pour créer la relation entre ces composants.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. Pour une application volumineuse, il peut être avantageux de partitionner l’application en différentes zones de fonctionnalités de premier niveau.For a large app, it may be advantageous to partition the app into separate high level areas of functionality. Par exemple, une application de commerce électronique avec plusieurs entités, telles que le paiement, le facturation et la recherche, etc. Chacune de ces unités a ses propres composants logiques de vues, contrôleurs et modèles.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.

API webWeb APIs

En plus d’être une excellente plateforme pour la création de sites web, ASP.NET Core MVC prend en charge la génération d’API web.In addition to being a great platform for building web sites, ASP.NET Core MVC has great support for building Web APIs. Vous pouvez créer des services accessibles à un large éventail de clients, notamment les navigateurs et les appareils mobiles.You can build services that reach a broad range of clients including browsers and mobile devices.

Le framework inclut la prise en charge de la négociation de contenu HTTP, ainsi que la prise en charge intégrée de la mise en forme des données au format JSON ou XML.The framework includes support for HTTP content-negotiation with built-in support to format data as JSON or XML. Écrivez des formateurs personnalisés pour ajouter la prise en charge de vos propres formats.Write custom formatters to add support for your own formats.

Utilisez la génération de lien pour activer la prise en charge de liens hypermédia.Use link generation to enable support for hypermedia. Activez facilement la prise en charge du partage de ressources cross-origin (CORS) afin que vos APIs Web puissent être partagées entre plusieurs applications Web.Easily enable support for cross-origin resource sharing (CORS) so that your Web APIs can be shared across multiple Web applications.

TestabilitéTestability

Le framework utilise les interfaces et l’injection de dépendances, ce qui le rend particulièrement adapté aux tests unitaires. De plus, le framework inclut des fonctionnalités (par exemple un fournisseur TestHost et InMemory pour Entity Framework) qui facilitent aussi les tests d’intégration.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. Découvrez en plus sur le test de la logique du contrôleur.Learn more about how to test controller logic.

Moteur de vue RazorRazor view engine

Les vues ASP.NET Core MVC utilisent le moteur de vue Razor pour afficher les vues.ASP.NET Core MVC views use the Razor view engine to render views. Razor est un langage de balisage de modèles compact, expressif et fluide qui permet de définir des vues avec du code C# incorporé.Razor is a compact, expressive and fluid template markup language for defining views using embedded C# code. Razor est utilisé pour générer dynamiquement du contenu web sur le serveur.Razor is used to dynamically generate web content on the server. Vous pouvez mélanger sans problème du code serveur avec du contenu et du code côté client.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>

À l’aide du moteur de vue Razor, vous pouvez définir des dispositions, des vues partielles et des sections remplaçables.Using the Razor view engine you can define layouts, partial views and replaceable sections.

Vues fortement typéesStrongly typed views

Les vues Razor dans MVC peuvent être fortement typées en fonction de votre modèle.Razor views in MVC can be strongly typed based on your model. Les contrôleurs peuvent passer un modèle fortement typé à des vues, ce qui leur permet de disposer du contrôle de type et de la prise en charge d’IntelliSense.Controllers can pass a strongly typed model to views enabling your views to have type checking and IntelliSense support.

Par exemple, la vue suivante affiche un modèle de type 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 HelpersTag Helpers

Les Tag helpers permettent au code côté serveur de participer à la création et au rendu des éléments HTML dans les fichiers Razor.Tag Helpers enable server side code to participate in creating and rendering HTML elements in Razor files. Vous pouvez utiliser des Tag helpers pour définir des balises personnalisées (par exemple, <environment>) ou pour modifier le comportement de balises existantes (par exemple, <label>).You can use tag helpers to define custom tags (for example, <environment>) or to modify the behavior of existing tags (for example, <label>). Les Tag helpers associent des éléments spécifiques en fonction du nom de l’élément et des ses attributs.Tag Helpers bind to specific elements based on the element name and its attributes. Ils fournissent les avantages de rendu côté serveur tout en conservant la possibilité d'éditer le HTML.They provide the benefits of server-side rendering while still preserving an HTML editing experience.

Il existe de nombreux Tag helpers intégrés pour les tâches courantes - telles que la création de formulaires, des liens, de chargement de ressources et plus - et bien d'autres sont disponibles dans les dépôts GitHub publics et sous forme de NuGet packages.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. Les Tag helpers sont créés en c#, et ils ciblent des éléments HTML en fonction de la balise parente, du nom d’attribut ou du nom de l’élément.Tag Helpers are authored in C#, and they target HTML elements based on element name, attribute name, or parent tag. Par exemple, le Tag Helper Link intégré permet de créer un lien vers l’action Login de AccountsController :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>

Le EnvironmentTagHelper permet d’inclure différents scripts dans vos vues (par exemple bruts ou minimisés) en fonction de l’environnement d’exécution, Développement, Préproduction ou Production :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>

Les Tag Helpers fournissent une expérience utilisateur de développement HTML et un riche environnement IntelliSense pour la création de balises HTML et Razor.Tag Helpers provide an HTML-friendly development experience and a rich IntelliSense environment for creating HTML and Razor markup. La plupart des Tag Helpers intégrés ciblent les éléments HTML existants et fournissent des attributs côté serveur pour l’élément.Most of the built-in Tag Helpers target existing HTML elements and provide server-side attributes for the element.

Composants de vuesView Components

Les composants de vues vous permettent de compresser la logique de rendu et de la réutiliser dans l’application.View Components allow you to package rendering logic and reuse it throughout the application. Ils sont similaires aux vues partielles, mais avec une logique associée.They're similar to partial views, but with associated logic.

Version de compatibilitéCompatibility version

La méthode SetCompatibilityVersion permet à une application d’accepter ou de refuser les changements de comportement potentiellement cassants introduits dans ASP.NET Core MVC 2.1 ou version ultérieure.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.

Pour plus d'informations, consultez Version de compatibilité pour ASP.NET Core MVC.For more information, see Version de compatibilité pour ASP.NET Core MVC.