70 votes

Comment utiliser une zone dans ASP.NET Core ?

Comment utiliser un Area dans ASP.NET Core ? Ce n'est pas correctement documenté !

Supposons que j'ai une application qui nécessite une section Admin. Cette section exige que ses vues soient placées dans cette zone. Toutes les demandes qui commencent par Admin/ devront être redirigés vers cette zone.

88voto

Vahid Amiri Points 3997

Afin d'inclure une zone dans une application ASP.NET Core, nous devons tout d'abord inclure une route conventionnelle dans le fichier Startup.cs (Il est préférable de le placer avant toute route non régionale) :

Dans la méthode Startup.cs/Configure :

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

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

Ensuite, créez un dossier nommé Areas dans la racine de l'application et en créer un autre nommé Admin à l'intérieur du premier, faites également en sorte que ces dossiers soient à l'intérieur du second. Admin (ViewComponent est facultatif) :

enter image description here

Maintenant, nous créons un contrôleur à l'intérieur du Controllers dossier nommé AdminController le contenu peut être comme :

[Area("Admin")]
[Route("admin")]
public class AdminController : Controller
{
    public AdminController()
    {
        // do stuff
    }

    public IActionResult Index()
    {
        return View();
    }

    [Route("[action]/{page:int?}")]
    public IActionResult Orders()
    {
        return View();
    }

    [Route("[action]")]
    public IActionResult Shop()
    {
        return View();
    }

    [Route("[action]/newest")]
    public IActionResult Payments()
    {
        return View();
    }
}

Pour que cela fonctionne, vous devez créer des vues pour toutes les actions qui renvoient un résultat. La hiérarchie des vues est identique à celle que vous avez dans un dossier Views hors zone :

enter image description here

Maintenant, vous devriez être prêt à partir !

Question : Que faire si je veux avoir un autre contrôleur dans ma zone ?

Réponse :

Il suffit d'ajouter un autre contrôleur à côté AdminController et assurez-vous que les routes sont comme les suivantes :

[Area("Admin")]
[Route("admin/[controller]")]
public class ProductsController : Controller
{
    public ProductsController()
    {
        //
    }

    [Route("{page:int?}")]
    public IActionResult Index()
    {
        return View();
    }
}

La partie importante est [Route("admin/[controller]")] . Avec cela, vous pouvez garder le style de routage à admin/controller/action/...

0 votes

Ceci est testé sur RC1, RC2, et 1.0. Cela fonctionne parfaitement.

0 votes

J'ai créé un exemple comme vous le montrez ci-dessus et ajouté la zone d'administration, il fonctionne bien, mais quand j'ai publié mon projet, il ne publie pas la zone d'administration et les vues et les fichiers, comment puis-je le gérer ?

0 votes

@motevallizadeh, Une autre de mes questions ! stackoverflow.com/questions/37326068/

42voto

Darío León Points 1

Sur ASP.NET Core 3.0 . Si vous travaillez avec Modèles de points d'extrémité Après avoir ajouté la zone (clic droit sur le projet, Ajouter, Nouvel élément échafaudé, Zone), vous devez ajouter manuellement le modèle de routage dans la méthode Configure du fichier startup.cs. (A ce stade, le ScaffoldingReadMe.txt généré n'est plus à jour).

app.UseEndpoints(endpoints =>
{

    endpoints.MapAreaControllerRoute(
        "Admin",
        "Admin",
        "Admin/{controller=Home}/{action=Index}/{id?}");

    endpoints.MapControllerRoute(
         name: "default",
         pattern: "{controller=Home}/{action=Index}/{id?}");
});

9voto

dewilde.it Points 81

Dans le Documents de Microsoft à partir desquels migrer ASP.NET CORE 2.2 à 3.0 la suggestion est de :

Remplacer UseMvc par UseEndpoints.

J'ai rencontré quelques difficultés en essayant de réparer mes Area's tout en faisant en sorte que l'Identité continue de fonctionner - mais la solution ci-dessous semble fonctionner pour ASP.NET CORE 3.0 :

app.UseEndpoints(endpoints =>
{
    endpoints.MapRazorPages();
    endpoints.MapControllerRoute("areas", "{area:exists}/{controller=Home}/{action=Index}/{id?}");
    endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}");
});

J'espère aussi pouvoir vous aider et réduire le temps de recherche :-)

5voto

Elnaz Points 1579

Scaffolding a généré tous les fichiers et ajouté les dépendances requises.

Cependant, le code de démarrage de l'application peut nécessiter des modifications supplémentaires pour que les choses fonctionnent de bout en bout. Si ce n'est pas déjà fait, ajoutez le code suivant à la méthode Configure de la classe Startup de votre application :

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

3voto

Yogesh Sharma Points 61

Mise en œuvre des domaines dans le routage Créez d'abord une zone (Admin) en utilisant VS et ajoutez le code suivant dans Startup.cs. Première façon de mettre en œuvre:- Ajouter l'action Login et Index du contrôleur et ajouter le code suivant, [Area("Admin")] est obligatoire à ajouter au niveau du contrôleur pour effectuer le routage des zones asp.net. Startup.cs

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

Note : Le routage par zone doit être placé en premier avec le routage hors zone, zone : existe est obligatoire pour ajouter le routage par zone.

Code du contrôleur :

[Area("Admin")] 
    public class LoginController : Controller
    {
        public IActionResult Index()
        {
            return Content("Area Admin Login Controller and Index Action");
        }
    }

Cette route peut être appelée en utilisant http://localhost:111/Admin

Deuxième façon d'implémenter le routage par zone : - Ajoutez le code suivant dans startup.cs.

app.UseMvc(routes =>
            {
                routes.MapAreaRoute(
    name: "default",
    areaName: "Guest",
    template: "Guest/{controller}/{action}/{id?}",
    defaults: new { controller = "GuestLogin", action = "Index" });
            });

Créez une zone "Guest", ajoutez le contrôleur "GuestLogin" et l'action "Index" et ajoutez le code suivant dans le contrôleur nouvellement créé.

[Area("Guest")]
    public class GuestLoginController : Controller
    {
        public IActionResult Index()
        {
            return Content("Area Guest Login Controller and Index Action");
        }
    }

Cette route peut être appelée en utilisant http://localhost:111/Guest

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X