ZonesAreas

Par Dhananjay Kumar et Rick AndersonBy Dhananjay Kumar and Rick Anderson

Les zones sont une fonctionnalité d’ASP.NET MVC utilisée pour organiser des fonctionnalités connexes dans un groupe sous la forme d’un espace de noms distinct (pour le routage) et d’une structure de dossiers (pour les vues).Areas are an ASP.NET MVC feature used to organize related functionality into a group as a separate namespace (for routing) and folder structure (for views). L’utilisation de zones crée une hiérarchie qui permet le routage par ajout d’un autre paramètre de route, area, à controller et à action.Using areas creates a hierarchy for the purpose of routing by adding another route parameter, area, to controller and action.

Les zones permettent de partitionner une application web ASP.NET Core MVC de grande taille 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 effectively an MVC structure inside an application. Dans un projet MVC, les composants logiques, comme Modèle, Contrôleur et Vue, sont conservés dans des dossiers différents, et MVC utilise des 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 de grande taille, il peut être avantageux de partitionner l’application en différentes zones de fonctionnalités de haut niveau.For a large app, it may be advantageous to partition the app into separate high level areas of functionality. Par exemple, considérons une application de e-commerce avec plusieurs entités métier, comme la commande, la facturation, la recherche, etc. Chacune de ces unités a ses propres vues, contrôleurs et modèles de composant logique.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. Dans ce scénario, vous pouvez utiliser des zones pour partitionner physiquement les composants métier dans le même projet.In this scenario, you can use Areas to physically partition the business components in the same project.

Une zone peut être définie comme une unité fonctionnelle plus petite dans un projet ASP.NET Core MVC avec son propre ensemble de contrôleurs, de vues et de modèles.An area can be defined as smaller functional units in an ASP.NET Core MVC project with its own set of controllers, views, and models.

Envisagez l’utilisation de zones dans un projet MVC quand :Consider using Areas in an MVC project when:

  • Votre application est constituée de plusieurs composants fonctionnels de haut niveau qui doivent être logiquement séparésYour application is made of multiple high-level functional components that should be logically separated

  • Vous voulez partitionner votre projet MVC de façon à pouvoir travailler indépendamment sur chaque zone fonctionnelleYou want to partition your MVC project so that each functional area can be worked on independently

Caractéristiques des zones :Area features:

  • Une application ASP.NET Core MVC peut avoir un nombre quelconque de zones.An ASP.NET Core MVC app can have any number of areas

  • Chaque zone a ses propres contrôleurs, modèles et vues.Each area has its own controllers, models, and views

  • Vous permet d’organiser des projets MVC de grande taille en plusieurs composants de haut niveau sur lesquels vous pouvez travailler indépendammentAllows you to organize large MVC projects into multiple high-level components that can be worked on independently

  • Prend en charge plusieurs contrôleurs portant le même nom, pour autant qu’ils soient dans des zones différentesSupports multiple controllers with the same name - as long as they have different areas

Examinons un exemple pour illustrer la façon dont les zones sont créées et utilisées.Let's take a look at an example to illustrate how Areas are created and used. Supposons que vous avez une application de magasin avec deux regroupements distincts de contrôleurs et de vues : Produits et Services.Let's say you have a store app that has two distinct groupings of controllers and views: Products and Services. Voici une structure de dossiers classique pour ce type d’application avec des zones MVC :A typical folder structure for that using MVC areas looks like below:

  • Nom du projetProject name

    • ZonesAreas

      • ProduitsProducts

        • ContrôleursControllers

          • HomeController.csHomeController.cs

          • ManageController.csManageController.cs

        • VuesViews

          • AccueilHome

            • Index.cshtmlIndex.cshtml
          • GérerManage

            • Index.cshtmlIndex.cshtml
      • ServicesServices

        • ContrôleursControllers

          • HomeController.csHomeController.cs
        • VuesViews

          • AccueilHome

            • Index.cshtmlIndex.cshtml

Quand MVC tente d’afficher une vue dans une zone, par défaut, il tente de chercher aux emplacements suivants :When MVC tries to render a view in an Area, by default, it tries to look in the following locations:

/Areas/<Area-Name>/Views/<Controller-Name>/<Action-Name>.cshtml
   /Areas/<Area-Name>/Views/Shared/<Action-Name>.cshtml
   /Views/Shared/<Action-Name>.cshtml

Il s’agit des emplacements par défaut, qui peuvent être changés via AreaViewLocationFormats sur Microsoft.AspNetCore.Mvc.Razor.RazorViewEngineOptions.These are the default locations which can be changed via the AreaViewLocationFormats on the Microsoft.AspNetCore.Mvc.Razor.RazorViewEngineOptions.

Par exemple, dans le code ci-dessous, le nom de dossier « Areas » a été changé en « Categories ».For example, in the below code instead of having the folder name as 'Areas', it has been changed to 'Categories'.

services.Configure<RazorViewEngineOptions>(options =>
   {
       options.AreaViewLocationFormats.Clear();
       options.AreaViewLocationFormats.Add("/Categories/{2}/Views/{1}/{0}.cshtml");
       options.AreaViewLocationFormats.Add("/Categories/{2}/Views/Shared/{0}.cshtml");
       options.AreaViewLocationFormats.Add("/Views/Shared/{0}.cshtml");
   });

Une chose à noter est que la structure du dossier Vues est la seule qui est considérée comme importante ici, et que le contenu du reste des dossiers, comme Contrôleurs et Modèles n’a pas d’importance.One thing to note is that the structure of the Views folder is the only one which is considered important here and the content of the rest of the folders like Controllers and Models does not matter. Par exemple, il n’est pas du tout nécessaire d’avoir des dossiers Contrôleurs et Modèles.For example, you need not have a Controllers and Models folder at all. Ceci fonctionne, car le contenu de Contrôleurs et de Modèles est simplement du code qui est compilé dans un fichier .dll, alors que le contenu de Vues ne l’est pas tant qu’une demande n’est pas adressée à cette vue.This works because the content of Controllers and Models is just code which gets compiled into a .dll where as the content of the Views isn't until a request to that view has been made.

Une fois que vous avez défini la hiérarchie des dossiers, vous devez indiquer à MVC que chaque contrôleur est associé à une zone.Once you've defined the folder hierarchy, you need to tell MVC that each controller is associated with an area. Vous faites cela en décorant le nom du contrôleur avec l’attribut [Area].You do that by decorating the controller name with the [Area] attribute.

...
   namespace MyStore.Areas.Products.Controllers
   {
       [Area("Products")]
       public class HomeController : Controller
       {
           // GET: /Products/Home/Index
           public IActionResult Index()
           {
               return View();
           }

           // GET: /Products/Home/Create
           public IActionResult Create()
           {
               return View();
           }
       }
   }

Configurez une définition de route qui fonctionne avec vos zones nouvellement créées.Set up a route definition that works with your newly created areas. L’article Routage vers les actions de contrôleur explique en détails comment créer des définitions de route, notamment l’utilisation de routes conventionnelles par rapport aux routes d’attributs.The Routing to Controller Actions article goes into detail about how to create route definitions, including using conventional routes versus attribute routes. Dans cet exemple, nous allons utiliser une route conventionnelle.In this example, we'll use a conventional route. Pour cela, ouvrez le fichier Startup.cs et modifiez-le en ajoutant la définition de route nommée areaRoute ci-dessous.To do so, open the Startup.cs file and modify it by adding the areaRoute named route definition below.

...
   app.UseMvc(routes =>
   {
     routes.MapRoute(
         name: "areaRoute",
         template: "{area:exists}/{controller=Home}/{action=Index}/{id?}");

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

Avec un accès à http://<yourApp>/products, la méthode d’action Index de HomeController dans la zone Products sera appelée.Browsing to http://<yourApp>/products, the Index action method of the HomeController in the Products area will be invoked.

  • Génération de liens depuis une action dans un contrôleur basé sur une zone vers une autre action au sein du même contrôleurGenerating links from an action within an area based controller to another action within the same controller.

    Supposons que le chemin de la requête actuelle soit /Products/Home/CreateLet's say the current request's path is like /Products/Home/Create

    Syntaxe de HtmlHelper : @Html.ActionLink("Go to Product's Home Page", "Index")HtmlHelper syntax: @Html.ActionLink("Go to Product's Home Page", "Index")

    Syntaxe de TagHelper : <a asp-action="Index">Go to Product's Home Page</a>TagHelper syntax: <a asp-action="Index">Go to Product's Home Page</a>

    Notez que nous ne devons pas fournir ici les valeurs « area » et « controller », car elles sont déjà disponibles dans le contexte de la requête actuelle.Note that we need not supply the 'area' and 'controller' values here as they're already available in the context of the current request. Ces types de valeurs sont appelées valeurs ambient.These kind of values are called ambient values.

  • Génération de liens depuis une action dans un contrôleur basé sur une zone vers une autre action sur un autre contrôleurGenerating links from an action within an area based controller to another action on a different controller

    Supposons que le chemin de la requête actuelle soit /Products/Home/CreateLet's say the current request's path is like /Products/Home/Create

    Syntaxe de HtmlHelper : @Html.ActionLink("Go to Manage Products Home Page", "Index", "Manage")HtmlHelper syntax: @Html.ActionLink("Go to Manage Products Home Page", "Index", "Manage")

    Syntaxe de TagHelper : <a asp-controller="Manage" asp-action="Index">Go to Manage Products Home Page</a>TagHelper syntax: <a asp-controller="Manage" asp-action="Index">Go to Manage Products Home Page</a>

    Notez qu’ici la valeur ambiante d’une « area » (zone) est utilisée, mais que la valeur « controller » est spécifiée explicitement ci-dessus.Note that here the ambient value of an 'area' is used but the 'controller' value is specified explicitly above.

  • Génération de liens depuis une action dans un contrôleur basé sur une zone vers une autre action sur un autre contrôleur et une autre zoneGenerating links from an action within an area based controller to another action on a different controller and a different area.

    Supposons que le chemin de la requête actuelle soit /Products/Home/CreateLet's say the current request's path is like /Products/Home/Create

    Syntaxe de HtmlHelper : @Html.ActionLink("Go to Services Home Page", "Index", "Home", new { area = "Services" })HtmlHelper syntax: @Html.ActionLink("Go to Services Home Page", "Index", "Home", new { area = "Services" })

    Syntaxe de TagHelper : <a asp-area="Services" asp-controller="Home" asp-action="Index">Go to Services Home Page</a>TagHelper syntax: <a asp-area="Services" asp-controller="Home" asp-action="Index">Go to Services Home Page</a>

    Notez qu’ici aucune valeur ambiante n’est utilisée.Note that here no ambient values are used.

  • Génération de liens depuis une action dans un contrôleur basé sur une zone vers une autre action sur un autre contrôleur mais pas dans une zoneGenerating links from an action within an area based controller to another action on a different controller and not in an area.

    Syntaxe de HtmlHelper : @Html.ActionLink("Go to Manage Products Home Page", "Index", "Home", new { area = "" })HtmlHelper syntax: @Html.ActionLink("Go to Manage Products Home Page", "Index", "Home", new { area = "" })

    Syntaxe de TagHelper : <a asp-area="" asp-controller="Manage" asp-action="Index">Go to Manage Products Home Page</a>TagHelper syntax: <a asp-area="" asp-controller="Manage" asp-action="Index">Go to Manage Products Home Page</a>

    Comme nous voulons générer des liens vers une action de contrôleur qui n’est pas basé sur une zone, nous vidons ici la valeur ambiante pour « area » (zone).Since we want to generate links to a non-area based controller action, we empty the ambient value for 'area' here.

Zones de publicationPublishing Areas

Tous les fichiers *.cshtml et wwwroot/** sont publiés en sortie quand <Project Sdk="Microsoft.NET.Sdk.Web"> est inclus dans le fichier .csproj.All *.cshtml and wwwroot/** files are published to output when <Project Sdk="Microsoft.NET.Sdk.Web"> is included in the .csproj file.