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

139

Nuestra compañía está desarrollando una API para nuestros productos y estamos pensando en usar ASP.NET MVC. Al diseñar nuestra API, decidimos usar 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, artisty api_key). En ASP.NET MVC, artistsería el controller, getImagesla acción, pero ¿cómo iba a pasar varios parámetros a la acción?

¿Es esto posible usando el formato anterior?

CodificaciónSin Comentarios
fuente

Respuestas:

279

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

public ActionResult GetImages(string artistName, string apiKey)

MVC completará automáticamente los parámetros cuando se le dé 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, así que algo como:

public ActionResult GetImages(string id, string apiKey)

se rellenarí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 MVC usa 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 quisieras apoyar una url como

/Artist/GetImages/cher/api-key

podría 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.

Ryan Brunner
fuente
1
Estoy trabajando con .NET 4 y MVC. Solo puedo pasar un parámetro en la ruta. Esta URL {controller} / {action} / {artistName} / {apikey} no se asigna a 2 parámetros para mí, sino que simplemente desencadena un error 404. Por lo que puedo decir, solo puede pasar 1 parámetro en la ruta. ¿Qué estoy haciendo mal?
DavidHyogo
1
@DavidHyogo: estaba experimentando el mismo problema. Por alguna razón, a pesar de que especifiqué la acción predeterminada, tuve que poner la acción que quería en mi enlace html, no solo el controlador y los parámetros.
Shaggy13spe
55
@DavidHyogo: tuve el mismo problema y descubrí que los parámetros de la plantilla de ruta deben coincidir exactamente con los nombres de los parámetros del método de acción, por ejemplo, para la ruta definida como {controller} / {action} / {artistName} / {apikey} el método de acción debe tener la firma Public ActionResult MyMethod (string artistName, string apikey)
Sudhanshu Mishra
66
Además, asegúrese de que su URL no quede atrapada por la ruta predeterminada antes de que llegue a su ruta personalizada. Utilizará la primera coincidencia según cómo los haya definido. En mi caso, estaba tratando de usar la ruta "MyController / {year} / {month}" para el valor predeterminado de Index, pero la ruta {controller} / {action} / {id} coincidía con mi URL (MyController / 2015 / 04), así que recibí un 404 porque no existía ninguna acción con el nombre 2015. Mover mi ruta personalizada a la parte superior solucionó el problema.
Sam
El nombre de los parámetros en routeconfig no coincidía con mi firma de Acción, por eso no funcionaba, seguí los pasos descritos por @dotnetguy y funcionó
pepitomb
26

Comenzando con MVC 5, también puede usar el Enrutamiento de atributos para mover la configuración de parámetros 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)
Bernard Vander Beken
fuente
55
El enrutamiento de atributos en ASP.NET Core MVC se describe en docs.microsoft.com/en-us/aspnet/core/mvc/controllers/…
Bernard Vander Beken
21

Puede pasar parámetros arbitrarios a través de la cadena de consulta, pero también puede configurar rutas personalizadas para manejarlo de una 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 su cadena de consulta de ejemplo.

Lo anterior es solo un ejemplo y no aplica las reglas y restricciones comerciales que tendrías que configurar para asegurarte de que las personas no 'piratearan' la URL.

George Stocker
fuente