147 votes

Routage avec plusieurs paramètres en utilisant ASP.NET MVC

Notre entreprise développe une API pour ses produits et nous envisageons d'utiliser ASP.NET MVC. Lors de la conception de notre API, nous avons décidé d'utiliser des appels comme celui ci-dessous pour que l'utilisateur demande des informations à l'API au format XML :

http://ws.audioscrobbler.com/2.0/?method=artist.getimages&artist=cher&api_key=b25b959554ed76058ac220b7b2e0a026

Comme vous pouvez le voir, plusieurs paramètres sont passés (c'est-à-dire artist y api_key ). Dans ASP.NET MVC, artist serait le controller , getImages l'action, mais comment puis-je passer plusieurs paramètres à l'action ?

Est-ce possible en utilisant le format ci-dessus ?

295voto

Ryan Brunner Points 8983

Les paramètres sont directement pris en charge dans MVC en ajoutant simplement des paramètres à vos méthodes d'action. Avec une action comme la suivante :

public ActionResult GetImages(string artistName, string apiKey)

MVC remplira automatiquement les paramètres lorsqu'il reçoit une URL comme celle-ci :

/Artist/GetImages/?artistName=cher&apiKey=XXX

Un autre cas particulier est celui des paramètres nommés "id". Tout paramètre nommé ID peut être placé dans le chemin d'accès plutôt que dans la chaîne de requête, ce qui donne quelque chose comme :

public ActionResult GetImages(string id, string apiKey)

serait remplie correctement avec une URL comme la suivante :

/Artist/GetImages/cher?apiKey=XXX

En outre, si vous avez des scénarios plus compliqués, vous pouvez personnaliser les règles de routage que MVC utilise pour localiser une action. Votre fichier global.asax contient des règles de routage qui peuvent être personnalisées. Par défaut, la règle ressemble à ceci :

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

Si vous vouliez prendre en charge une url comme

/Artist/GetImages/cher/api-key

vous pourriez ajouter une route comme :

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

et une méthode comme le premier exemple ci-dessus.

2 votes

Je travaille avec .NET 4 et MVC. Je ne peux passer qu'un seul paramètre dans le chemin d'accès. L'URL {controller}/{action}/{artistName}/{apikey} ne correspond pas à 2 paramètres pour moi mais déclenche simplement une erreur 404. D'après ce que je sais, vous ne pouvez passer qu'un seul paramètre dans le chemin d'accès. Qu'est-ce que je fais de mal ?

2 votes

@DavidHyogo - J'ai rencontré le même problème. Pour une raison quelconque, même si j'ai spécifié l'action par défaut, j'ai dû mettre l'action que je voulais dans mon lien html, pas seulement le contrôleur et les paramètres.

7 votes

@DavidHyogo : J'ai eu le même problème et j'ai découvert que les paramètres de votre modèle de route doivent correspondre exactement aux noms des paramètres de la méthode d'action. Par exemple, pour une route définie comme {controller}/{action}/{artistName}/{apikey}, la méthode d'action doit avoir la signature suivante : public ActionResult MyMethod(string artistName, string apikey)

28voto

À partir de MVC 5, vous pouvez également utiliser le routage des attributs pour déplacer la configuration des paramètres URL vers vos contrôleurs.

Une discussion détaillée est disponible ici : http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5.aspx

Résumé :

Vous devez d'abord activer le routage par attributs

 public class RouteConfig 
 {
     public static void RegisterRoutes(RouteCollection routes)
     {
         routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

         routes.MapMvcAttributeRoutes();
     } 
 }

Vous pouvez ensuite utiliser des attributs pour définir des paramètres et, éventuellement, des types de données.

public class BooksController : Controller
{
    // eg: /books
    // eg: /books/1430210079
    [Route("books/{isbn?}")]
    public ActionResult View(string isbn)

5 votes

Le routage des attributs dans ASP.NET Core MVC est décrit à l'adresse suivante docs.microsoft.com/fr/us/aspnet/core/mvc/controllers/

23voto

George Stocker Points 31258

Vous pouvez transmettre des paramètres arbitraires par le biais de la chaîne de requête, mais vous pouvez également configurer des routes personnalisées pour les traiter de manière RESTful :

http://ws.audioscrobbler.com/2.0/?method=artist.getimages&artist=cher&
                                  api_key=b25b959554ed76058ac220b7b2e0a026

C'est possible :

routes.MapRoute(
    "ArtistsImages",
    "{ws}/artists/{artist}/{action}/{*apikey}",
    new { ws = "2.0", controller="artists" artist = "", action="", apikey="" }
    );

Donc si quelqu'un a utilisé la route suivante :

ws.audioscrobbler.com/2.0/artists/cher/images/b25b959554ed76058ac220b7b2e0a026/

Cela les mènerait au même endroit que votre exemple de chaîne de recherche.

Ce qui précède n'est qu'un exemple et ne tient pas compte des règles et contraintes commerciales que vous devriez mettre en place pour vous assurer que les gens ne "piratent" pas l'URL.

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