c# - attribute - Enrutamiento con múltiples parámetros usando ASP.NET MVC
route controller c# (3)
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:
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?
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)
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.