Partager via


Création d’une contrainte de route (C#)

par Stephen Walther

Dans ce tutoriel, Stephen Walther montre comment contrôler la façon dont les requêtes de navigateur correspondent aux itinéraires en créant des contraintes de routage avec des expressions régulières.

Vous utilisez des contraintes de routage pour restreindre les demandes de navigateur qui correspondent à un itinéraire particulier. Vous pouvez utiliser une expression régulière pour spécifier une contrainte d’itinéraire.

Par exemple, imaginez que vous avez défini l’itinéraire dans listing 1 dans votre fichier Global.asax.

Listing 1 - Global.asax.cs

routes.MapRoute(
    "Product",
    "Product/{productId}",
    new {controller="Product", action="Details"}
);

La liste 1 contient un itinéraire nommé Product. Vous pouvez utiliser l’itinéraire Product pour mapper les demandes de navigateur au ProductController contenu dans la description 2.

Listing 2 - Controllers\ProductController.cs

using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
    public class ProductController : Controller
    {
        public ActionResult Details(int productId)
        {
            return View();
        }
    }
}

Notez que l’action Details() exposée par le contrôleur product accepte un paramètre unique nommé productId. Ce paramètre est un paramètre entier.

L’itinéraire défini dans listing 1 correspond à l’une des URL suivantes :

  • /Product/23
  • /Product/7

Malheureusement, l’itinéraire correspond également aux URL suivantes :

  • /Product/blah
  • /Product/apple

Étant donné que l’action Details() attend un paramètre entier, l’exécution d’une requête qui contient autre chose qu’une valeur entière entraîne une erreur. Par exemple, si vous tapez l’URL /Product/apple dans votre navigateur, vous obtenez la page d’erreur de la figure 1.

Boîte de dialogue New Project

Figure 01 : Affichage de l’explosion d’une page (cliquer pour afficher l’image en taille réelle)

Ce que vous voulez vraiment faire, c’est uniquement faire correspondre les URL qui contiennent un productId entier approprié. Vous pouvez utiliser une contrainte lors de la définition d’un itinéraire pour restreindre les URL qui correspondent à l’itinéraire. L’itinéraire Product modifié dans la liste 3 contient une contrainte d’expression régulière qui correspond uniquement aux entiers.

Listing 3 - Global.asax.cs

routes.MapRoute(
    "Product",
    "Product/{productId}",
    new {controller="Product", action="Details"},
    new {productId = @"\d+" }
 );

L’expression régulière \d+ correspond à un ou plusieurs entiers. Cette contrainte entraîne la correspondance entre l’itinéraire Product et les URL suivantes :

  • /Product/3
  • /Product/8999

Mais pas les URL suivantes :

  • /Product/apple

  • /Produit

  • Ces demandes de navigateur sont gérées par un autre itinéraire ou, s’il n’y a pas d’itinéraires correspondants, une erreur La ressource est introuvable est retournée.