Enrutamiento con múltiples parámetros usando ASP.NET MVC

Nuestra compañía está desarrollando una API para nuestros productos y estamos pensando en usar ASP.NET MVC. Al diseñar nuestra API, decidimos utilizar llamadas como la siguiente para que el usuario solicite información de la API en formato XML:

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

Como puede ver, se pasan múltiples parámetros (es decir, artist y api_key ). En ASP.NET MVC, el artist sería el controller , getImages la acción, pero ¿cómo pasaría múltiples parámetros a la acción?

¿Esto es posible utilizando el formato anterior?

Los parámetros se admiten directamente en MVC simplemente agregando parámetros en sus métodos de acción. Dada una acción como la siguiente:

 public ActionResult GetImages(string artistName, string apiKey) 

MVC rellenará automáticamente los parámetros cuando se le proporcione una URL como:

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

Un caso especial adicional son los parámetros llamados “id”. Cualquier parámetro llamado ID se puede poner en la ruta en lugar de la cadena de consulta, por lo que algo así como:

 public ActionResult GetImages(string id, string apiKey) 

se llenaría correctamente con una URL como la siguiente:

 /Artist/GetImages/cher?apiKey=XXX 

Además, si tiene escenarios más complicados, puede personalizar las reglas de enrutamiento que usa MVC para ubicar una acción. Su archivo global.asax contiene reglas de enrutamiento que se pueden personalizar. Por defecto, la regla se ve así:

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

Si quisiera soportar una url como

 /Artist/GetImages/cher/api-key 

podrías agregar una ruta como:

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

y un método como el primer ejemplo anterior.

Puede pasar parámetros arbitrarios a través de la cadena de consulta, pero también puede configurar rutas personalizadas para manejarlo de manera RESTful:

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

Eso podria ser:

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

Entonces, si alguien usó la siguiente ruta:

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

Los llevaría al mismo lugar que hizo su cadena de consulta de ejemplo.

Lo anterior es solo un ejemplo, y no aplica las reglas y restricciones comerciales que tendría que configurar para asegurarse de que las personas no ‘hackearon’ la URL.

Comenzando con MVC 5, también puede usar Attribute Routing para mover la configuración del parámetro de URL a sus controladores.

Una discusión detallada está disponible aquí: http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5.aspx

Resumen:

Primero habilita el enrutamiento de atributos

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

Luego puede usar atributos para definir parámetros y opcionalmente tipos de datos

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