Roteamento com vários parâmetros usando o ASP.NET MVC

Nossa empresa está desenvolvendo uma API para nossos produtos e estamos pensando em usar o ASP.NET MVC. Ao projetar nossa API, decidimos usar chamadas como a abaixo para o usuário solicitar informações da API no formato XML:

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

Como você pode ver, vários parâmetros são passados ​​(por exemplo, artist e api_key ). Na asp.net MVC, artist seria o controller , getImages a ação, mas como eu passaria vários parâmetros para a ação?

Isso é possível usando o formato acima?

Os parâmetros são diretamente suportados no MVC simplesmente adicionando parâmetros aos seus methods de ação. Dada uma ação como a seguinte:

 public ActionResult GetImages(string artistName, string apiKey) 

O MVC preencherá automaticamente os parâmetros quando receber um URL como:

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

Um caso especial adicional é chamado de “id”. Qualquer parâmetro chamado ID pode ser colocado no caminho em vez da string de consulta, então algo como:

 public ActionResult GetImages(string id, string apiKey) 

seria preenchido corretamente com um URL como o seguinte:

 /Artist/GetImages/cher?apiKey=XXX 

Além disso, se você tiver cenários mais complicados, poderá personalizar as regras de roteamento que o MVC usa para localizar uma ação. Seu arquivo global.asax contém regras de roteamento que podem ser personalizadas. Por padrão, a regra se parece com isso:

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

Se você quisesse apoiar um URL como

 /Artist/GetImages/cher/api-key 

você poderia adicionar uma rota como:

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

e um método como o primeiro exemplo acima.

Você pode passar parâmetros arbitrários por meio da string de consulta, mas também pode configurar rotas personalizadas para manipulá-las de uma maneira RESTful:

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

Isso poderia ser:

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

Então, se alguém usou o seguinte caminho:

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

Isso os levaria ao mesmo lugar que o seu querystring de exemplo.

O texto acima é apenas um exemplo e não aplica as regras de negócios e as restrições que você deve configurar para garantir que as pessoas não “hackearam” o URL.

Começando com o MVC 5, você também pode usar o Roteamento de Atributos para mover a configuração do parâmetro de URL para seus controladores.

Uma discussão detalhada está disponível aqui: http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5.aspx

Resumo:

Primeiro você habilita o roteamento de atributos

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

Então você pode usar atributos para definir parâmetros e, opcionalmente, tipos de dados

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