2010-02-11 27 views
109

Nuestra compañía está desarrollando una API para nuestros productos y estamos pensando en usar ASP.NET MVC. Si bien el diseño de nuestra API, hemos decidido utilizar las llamadas como la siguiente para el usuario para solicitar información a la API en formato XML:Enrutamiento con múltiples parámetros usando ASP.NET MVC

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

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

¿Esto también es posible utilizando el formato anterior?

Respuesta

239

Los parámetros son soportados 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 se rellenará automáticamente los parámetros cuando se le da una URL como:

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

Un caso especial adicional es parámetros con nombre "id". Cualquier ID de parámetro con nombre se puede poner en el camino en lugar de la cadena de consulta, así que algo como:

public ActionResult GetImages(string id, string apiKey) 

serían ocupados correctamente con una URL como la siguiente:

/Artist/GetImages/cher?apiKey=XXX 

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

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

Si quieres apoyar una URL como

/Artist/GetImages/cher/api-key 

se podría añadir 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 de arriba

+1

Estoy trabajando con .N ET 4 y MVC. Solo puedo pasar un parámetro en la ruta. Esta URL {controller}/{action}/{artistName}/{apikey} no se correlaciona con 2 parámetros, sino que simplemente desencadena un error 404. Por lo que puedo decir, solo puedes pasar 1 parámetro en la ruta. ¿Qué estoy haciendo mal? – DavidHyogo

+1

@DavidHyogo - Estaba experimentando el mismo problema. Por alguna razón, aunque especifiqué la acción predeterminada, tuve que poner realmente la acción que quería en mi enlace html, no solo el controlador y los parámetros. – Shaggy13spe

+5

@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, p. Ej. 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) – dotnetguy

18

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

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

que podrían ser:

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

Así que si alguien utilizó la siguiente ruta:

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

Les llevaría al mismo lugar que su ejempl e querystring hizo.

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

15

Comenzando con MVC 5, también puede usar Attribute Routing 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 le permiten atributo de enrutamiento

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

     routes.MapMvcAttributeRoutes(); 
    } 
} 

continuación, puede utilizar atributos para definir los parámetros y tipos de datos, opcionalmente

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

El enrutamiento de atributos en ASP.NET Core MVC se describe en https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing#attribute-routing –

Cuestiones relacionadas