Instradamento con più parametri usando ASP.NET MVC

La nostra azienda sta sviluppando un’API per i nostri prodotti e stiamo pensando di utilizzare ASP.NET MVC. Durante la progettazione della nostra API, abbiamo deciso di utilizzare chiamate come quella seguente per consentire all’utente di richiedere informazioni dall’API in formato XML:

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

Come puoi vedere, vengono passati più parametri (es. artist e api_key ). In ASP.NET MVC, l’ artist sarebbe il controller , getImages l’azione, ma come dovrei passare più parametri all’azione?

Questo è ansible anche utilizzando il formato sopra?

I parametri sono direttamente supportati in MVC semplicemente aggiungendo parametri ai tuoi metodi di azione. Data un’azione come la seguente:

 public ActionResult GetImages(string artistName, string apiKey) 

MVC popolerà automaticamente i parametri quando viene fornito un URL come:

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

Un caso speciale aggiuntivo sono i parametri denominati “id”. Qualsiasi parametro denominato ID può essere inserito nel percorso piuttosto che nella querystring, quindi qualcosa del tipo:

 public ActionResult GetImages(string id, string apiKey) 

sarebbe popolato correttamente con un URL come il seguente:

 /Artist/GetImages/cher?apiKey=XXX 

Inoltre, se hai scenari più complicati, puoi personalizzare le regole di routing che MVC utilizza per individuare un’azione. Il tuo file global.asax contiene regole di routing che possono essere personalizzate. Di default la regola si presenta così:

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

Se si desidera supportare un URL come

 /Artist/GetImages/cher/api-key 

potresti aggiungere un percorso come:

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

e un metodo come il primo esempio sopra.

È ansible passare parametri arbitrari attraverso la stringa di query, ma è anche ansible impostare percorsi personalizzati per gestirli in modo RESTful:

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

Quello potrebbe essere:

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

Quindi, se qualcuno ha usato il seguente percorso:

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

Li avrebbe portati nello stesso posto del tuo querystring di esempio.

Quanto sopra è solo un esempio e non applica le regole e i vincoli aziendali che dovresti impostare per assicurarti che le persone non “modifichino” l’URL.

A partire da MVC 5, puoi anche utilizzare Attribute Routing per spostare la configurazione dei parametri URL sui tuoi controller.

Una discussione dettagliata è disponibile qui: http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5.aspx

Sommario:

Per prima cosa abiliti il ​​routing degli attributi

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

Quindi è ansible utilizzare gli attributi per definire i parametri e facoltativamente i tipi di dati

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