web-dev-qa-db-fra.com

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

Notre société développe une API pour nos produits et envisage 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 permettre à l'utilisateur de demander 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 constater, plusieurs paramètres sont passés (c.-à-d. artist et api_key). Dans ASP.NET MVC, artist serait la controller, getImages l'action, mais comment pourrais-je transmettre plusieurs paramètres à l'action?

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

129
CodingWithoutComments

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 si une URL telle que:

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

Un autre cas particulier concerne les paramètres nommés "id". N'importe quel 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 du type suivant:

/Artist/GetImages/cher?apiKey=XXX

De plus, si vous avez des scénarios plus complexes, vous pouvez personnaliser les règles de routage utilisées par MVC pour localiser une action. Votre fichier global.asax contient des règles de routage pouvant ê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 supporter 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.

271
Ryan Brunner

À 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 =

Sommaire:

D'abord, vous activez le routage d'attribut

 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)
22

Vous pouvez transmettre 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 RESTful:

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. Il n’applique pas les règles et contraintes commerciales que vous auriez à configurer pour vous assurer que les personnes ne "piratent" pas l’URL.

21
George Stocker