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

Par Steve SmithBy Steve Smith

ASP.NET Core MVC est une infrastructure riche pour la création d’applications web et d'APIs à 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.

Quel est le modèle de conception 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 les références 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 qui a des dépendances réparties sur deux ou plusieurs de ces trois zones.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 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 d’un des principaux avantages de la séparation.This is one of the key benefits of the separation. Cette séparation permet au modèle d'être généré et testé 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 dans une application MVC représente l’état de l’application et de n'importe quelles logiques métier ou opérations qui doivent être effectuées par celui-ci.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 la logique d’implémentation de 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. En savoir plus sur les différents types de types de modèles.Learn more about some different kinds of model types.

Responsabilités de la vueView Responsibilities

Les vues sont chargées de présenter du contenu via l’interface utilisateur.Views are responsible for presenting content through the user interface. Elles utilisent le moteur d’affichage Razor pour incorporer le code .NET dans le balisage HTML.They use the Razor view engine to embed .NET code in HTML markup. Il doit y avoir un minimum de logique dans les vues, et toute logique présente 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 trouvez nécessaire d’effectuer une grande partie de la logique dans l’affichage des fichiers pour afficher des données à partir d’un modèle complexe, envisagez d’utiliser un composant de vue (View Component), un ViewModel, ou un modèle d’affichage (view template) pour simplifier l’affichage.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 les composants qui gèrent l'interaction avec l’utilisateur, travaillent avec le modèle et finalement sélectionnent une vue à restituer.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 les informations ; le contrôleur gère et répond à la saisie de l’utilisateur et à l’interaction.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 et est chargé de sélectionner les types de modèle avec lequels travailler et la vue à restituer (d'où son nom - 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

Les contrôleurs ne doivent pas être trop complexes en possédant trop de responsabilités.Controllers shouldn't be overly complicated by too many responsibilities. Pour empêcher la logique du contrôleur de devenir trop complexe, utilisez le principe de responsabilité unique enlevant de la logique métier en dehors du contrôleur pour la placer dans 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 trouvez que les actions du contrôleur effectuent fréquemment les mêmes types d’actions, vous pouvez suivre le principe DRY (Don't Repeat Yourself : Ne vous répétez pas) en déplaçant ces actions courantes 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 MVC CoreWhat is ASP.NET Core MVC

L’infrastructure ASP.NET MVC Core est un framework de présentation léger, open source, facilement testable et optimisé pour une utilisation avec 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 MVC Core offre un fonctionnement basé sur des patterns pour créer des sites web dynamiques permettant 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 MVC core inclut les éléments suivants :ASP.NET Core MVC includes the following:

RoutageRouting

ASP.NET MVC Core 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 URL 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 une convention vous permet de définir globalement les formats d'URL que votre application accepte et comment chacun de ces formats est mappé à 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. Lorsqu’une demande entrante est reçue, le moteur de routage analyse l’URL et la fait correspondre à l’un des formats d’URL définis et appelle ensuite 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 par attribut (Attribute routing) vous permet de spécifier des informations de routage en décorant vos contrôleurs et vos actions avec les attributs qui définissent les routes 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 route sont placées dans le contrôleur au-dessus de l’action avec laquelle 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 modèle (Model binding)Model 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 ; elle a simplement les données en tant que paramètres dans ces 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 publiées sur le serveur, ainsi que sur le serveur avant que l’action du contrôleur ne soit appelée.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 sur les types de modèle est ajoutée aux vues rendues sous forme d’annotations discrètes (unobtrusive) et est réalisée dans le navigateur avec 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.

Injection de dépendancesDependency injection

ASP.NET Core a une prise en charge intégrée pour l'injection de dépendance (DI).ASP.NET Core has built-in support for dependency injection (DI). Dans ASP.NET Core MVC, les contrôleurs peuvent faire appel à des services nécessaires via leurs constructeurs, ce qui leur permet de suivre le principe de 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épendance 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 aident les développeurs à encapsuler des problèmes transversaux, tels que la gestion des exceptions ou l’autorisation.Filters help developers encapsulate cross-cutting concerns, like exception handling or authorization. Les filtres permettent une logique personnalisée en cours d’exécution et de post-traitement pour les méthodes d’action et peuvent être configurés pour s’exécuter à certains endroits dans le pipeline de l’exécution pour une demande 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. Les filtres peuvent être appliqués aux contrôleurs ou aux actions sous forme d’attributs (ou peuvent être exécutés 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]
   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, la 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 de constituer une plate-forme idéale pour la création de sites web, ASP.NET Core MVC a une très bonne prise en charge pour 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 prend en charge pour la négociation de contenu HTTP avec prise en charge intégrée pour mettre en forme données en tant que 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 liens pour activer la prise en charge de liens hypermédias.Use link generation to enable support for hypermedia. Activez facilement la prise en charge de Le partage de ressources cross-origin (CORS) afin que vos API 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

Utilisation de l’infrastructure des interfaces et injection de dépendances conviennent parfaitement aux tests unitaires et l’infrastructure comprend des fonctionnalités (par exemple, un fournisseur TestHost et en mémoire pour Entity Framework) qui tests d’intégration rapide et simple également.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. En savoir plus sur comment tester 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 d’affichage Razor pour restituer les vues.ASP.NET Core MVC views use the Razor view engine to render views. Razor est un langage de balisage de modèle compact, expressif et fluide pour définir des vues à l’aide de 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 le contenu web sur le serveur.Razor is used to dynamically generate web content on the server. Vous pouvez mélangez proprement 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>

En utilisant le moteur d’affichage 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é aux vues en permettant la vérification du type et le support de l'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 le 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 packagesThere 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émentTag Helpers are authored in C#, and they target HTML elements based on element name, attribute name, or parent tag. Par exemple, la fonction intégrée LinkTagHelper peut être utilisée pour créer un lien vers l'action Login du 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>

L'EnvironmentTagHelper peut être utilisé pour inclure des scripts différents dans vos vues (par exemple, bruts ou minifiés) en fonction de l’environnement d’exécution, par exemple le développement, le staging ou la 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 de développement HTML conviviale et un environnement IntelliSense riche 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 des é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.

View componentsView Components

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