Vue d’ensemble du routage ASP.NET MVC (C#)

par Stephen Walther

Dans ce tutoriel, Stephen Walther montre comment l’infrastructure ASP.NET MVC mappe les requêtes du navigateur aux actions du contrôleur.

Dans ce tutoriel, vous allez découvrir une fonctionnalité importante de chaque application MVC ASP.NET appelée routage ASP.NET. Le module routage ASP.NET est responsable du mappage des requêtes entrantes à des actions de contrôleur MVC particulières. À la fin de ce tutoriel, vous comprendrez comment la table de routage standard mappe les requêtes aux actions du contrôleur.

Utilisation de la table de routage par défaut

Lorsque vous créez une application MVC ASP.NET, l’application est déjà configurée pour utiliser ASP.NET routage. ASP.NET Routage est configuré à deux emplacements.

Tout d’abord, ASP.NET routage est activé dans le fichier de configuration web de votre application (fichier Web.config). Le fichier de configuration contient quatre sections pertinentes pour le routage : la section system.web.httpModules, la section system.web.httpHandlers, la section system.webserver.modules et la section system.webserver.handlers. Veillez à ne pas supprimer ces sections, car sans ces sections, le routage ne fonctionnera plus.

Deuxièmement, et plus important encore, une table de routage est créée dans le fichier Global.asax de l’application. Le fichier Global.asax est un fichier spécial qui contient des gestionnaires d’événements pour ASP.NET événements de cycle de vie des applications. La table de routage est créée pendant l’événement Démarrage de l’application.

Le fichier dans Listing 1 contient le fichier Global.asax par défaut pour une application MVC ASP.NET.

Listing 1 - Global.asax.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MvcApplication1
{
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit https://go.microsoft.com/?LinkId=9394801

    public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default",                                              // Route name
                "{controller}/{action}/{id}",                           // URL with parameters
                new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
            );
        }

        protected void Application_Start()
        {
            RegisterRoutes(RouteTable.Routes);
        }
    }
}

Lorsqu’une application MVC démarre pour la première fois, la méthode Application_Start() est appelée. Cette méthode, à son tour, appelle la méthode RegisterRoutes(). La méthode RegisterRoutes() crée la table de routage.

La table de routage par défaut contient un itinéraire unique (nommé Default). L’itinéraire par défaut mappe le premier segment d’une URL au nom d’un contrôleur, le deuxième segment d’une URL à une action de contrôleur et le troisième segment à un paramètre nommé id.

Imaginez que vous entrez l’URL suivante dans la barre d’adresse de votre navigateur web :

/Home/Index/3

L’itinéraire par défaut mappe cette URL aux paramètres suivants :

  • controller = Accueil

  • action = Index

  • id = 3

Lorsque vous demandez l’URL /Home/Index/3, le code suivant est exécuté :

HomeController.Index(3)

La route par défaut inclut les valeurs par défaut pour les trois paramètres. Si vous ne fournissez pas de contrôleur, le paramètre du contrôleur est défini par défaut sur la valeur Home. Si vous ne fournissez pas d’action, le paramètre d’action est défini par défaut sur la valeur Index. Enfin, si vous ne fournissez pas d’ID, le paramètre id est défini par défaut sur une chaîne vide.

Examinons quelques exemples de la façon dont l’itinéraire par défaut mappe les URL aux actions du contrôleur. Imaginez que vous entrez l’URL suivante dans la barre d’adresse de votre navigateur :

/Accueil

En raison des valeurs par défaut du paramètre d’itinéraire Default, l’entrée de cette URL entraîne l’appel de la méthode Index() de la classe HomeController dans listing 2.

Listing 2 - HomeController.cs

using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index(string id)
        {
            return View();
        }
    }
}

Dans la liste 2, la classe HomeController inclut une méthode nommée Index() qui accepte un paramètre unique nommé Id. L’URL /Home provoque l’appel de la méthode Index() avec une chaîne vide comme valeur du paramètre Id.

En raison de la façon dont l’infrastructure MVC appelle les actions du contrôleur, l’URL /Home correspond également à la méthode Index() de la classe HomeController dans listing 3.

Listing 3 - HomeController.cs (Action d’index sans paramètre)

using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
    }
}

La méthode Index() dans listing 3 n’accepte aucun paramètre. L’URL /Home entraîne l’appel de cette méthode Index(). L’URL /Home/Index/3 appelle également cette méthode (l’ID est ignoré).

L’URL /Home correspond également à la méthode Index() de la classe HomeController dans listing 4.

Listing 4 - HomeController.cs (Action d’index avec paramètre nullable)

using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index(int? id)
        {
            return View();
        }
    }
}

Dans listing 4, la méthode Index() a un paramètre Integer. Étant donné que le paramètre est un paramètre nullable (peut avoir la valeur Null), l’index() peut être appelé sans générer d’erreur.

Enfin, l’appel de la méthode Index() dans listing 5 avec l’URL /Home provoque une exception, car le paramètre Id n’est pas un paramètre nullable. Si vous tentez d’appeler la méthode Index(), vous obtenez l’erreur affichée dans la figure 1.

Listing 5 - HomeController.cs (Action d’index avec le paramètre ID)

using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index(int id)
        {
            return View();
        }
    }
}

Appel d’une action de contrôleur qui attend une valeur de paramètre

Figure 01 : Appel d’une action de contrôleur qui attend une valeur de paramètre (cliquer pour afficher l’image de taille réelle)

L’URL /Accueil/Index/3, en revanche, fonctionne parfaitement avec l’action Indexer le contrôleur dans La liste 5. La requête /Home/Index/3 entraîne l’appel de la méthode Index() avec un paramètre Id qui a la valeur 3.

Résumé

L’objectif de ce tutoriel était de vous fournir une brève présentation du routage ASP.NET. Nous avons examiné la table de routage par défaut que vous obtenez avec une nouvelle application MVC ASP.NET. Vous avez appris comment l’itinéraire par défaut mappe les URL aux actions du contrôleur.