Routage avec plusieurs paramètres à l'aide d'ASP.NET MVC


139

Notre société développe une API pour nos 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 artist-à- dire et api_key). Dans ASP.NET MVC, artistserait le controller, getImagesl'action, mais comment pourrais - je passer plusieurs paramètres à l'action?

Est-ce même possible en utilisant le format ci-dessus?

Réponses:


279

Les paramètres sont directement pris en charge dans MVC en ajoutant simplement des paramètres à vos méthodes d'action. Étant donné une action comme celle-ci:

public ActionResult GetImages(string artistName, string apiKey)

MVC remplira automatiquement les paramètres lorsqu'il reçoit une URL telle que:

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

Un cas spécial supplémentaire est celui des paramètres nommés "id". Tout paramètre nommé ID peut être placé dans le chemin plutôt que dans la chaîne de requête, donc quelque chose comme:

public ActionResult GetImages(string id, string apiKey)

serait rempli correctement avec une URL comme celle-ci:

/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 souhaitez prendre en charge une URL comme

/Artist/GetImages/cher/api-key

vous pouvez ajouter un itinéraire 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.


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

1
@DavidHyogo - Je rencontrais 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.
Shaggy13spe

5
@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 la route définie comme {controller} / {action} / {artistName} / {apikey} la méthode d'action doit avoir la signature public ActionResult MyMethod (string artistName, string apikey)
Sudhanshu Mishra

6
Assurez-vous également que votre URL n'est pas capturée par l'itinéraire par défaut avant d'atteindre votre URL personnalisée. Il utilisera la première correspondance en fonction de la façon dont vous les avez définies. Dans mon cas, j'essayais d'utiliser la route "MyController / {year} / {month}" pour l'index par défaut, mais la route {controller} / {action} / {id} correspondait à mon URL (MyController / 2015 / 04), donc je recevais une 404 car aucune action avec le nom 2015 n'existait. Le déplacement de mon itinéraire personnalisé vers le haut a résolu le problème.
Sam le

Le nom des paramètres dans le routeconfig ne correspondait pas à ma signature Action, c'est pourquoi cela ne fonctionnait pas, j'ai suivi les étapes décrites par @dotnetguy et cela a fonctionné
pepitomb

26

À partir de MVC 5, vous pouvez également utiliser le routage d'attributs pour déplacer la configuration des paramètres d'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é:

Commencez par activer le routage d'attributs

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

         routes.MapMvcAttributeRoutes();
     } 
 }

Ensuite, vous pouvez 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
Le routage des attributs dans ASP.NET Core MVC est décrit sur docs.microsoft.com/en-us/aspnet/core/mvc/controllers
Bernard Vander Beken

21

Vous pouvez passer des paramètres arbitraires via la chaîne de requête, mais vous pouvez également configurer des itinéraires personnalisés pour le gérer de manière REST:

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

Cela pourrait être:

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

Donc, si quelqu'un a utilisé l'itinéraire suivant:

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

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

Ce qui précède n'est qu'un exemple et n'applique pas les règles métier et les contraintes que vous devrez mettre en place pour vous assurer que les gens ne «piratent» pas l'URL.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.