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

139

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 ​​(ie artiste api_key). Em ASP.NET MVC, artistseria a controller, getImagesa ação, mas como eu ia passar múltiplos parâmetros para a ação?

Isso é possível usando o formato acima?

CodingWithoutComments
fonte

Respostas:

279

Os parâmetros são suportados diretamente no MVC simplesmente adicionando parâmetros aos seus métodos 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 são os parâmetros denominados "id". Qualquer parâmetro chamado ID pode ser colocado no caminho, e não na string de consulta, 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 fica assim:

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

Se você quisesse suportar um URL como

/Artist/GetImages/cher/api-key

você pode 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.

Ryan Brunner
fonte
1
Estou trabalhando com o .NET 4 e o MVC. Só posso passar um parâmetro no caminho. Este URL {controller} / {action} / {artistName} / {apikey} não é mapeado para dois parâmetros para mim, mas simplesmente aciona um erro 404. Tanto quanto posso dizer, você só pode passar 1 parâmetro no caminho. O que estou fazendo de errado?
DavidHyogo 12/02
1
@DavidHyogo - Eu estava enfrentando o mesmo problema. Por qualquer motivo, mesmo que eu tenha especificado a ação padrão, tive que realmente colocar a ação que queria no meu link html, não apenas no controlador e nos parâmetros.
24513 Shaggy13spe
5
@ David David: Eu tive o mesmo problema e descobri que os parâmetros do modelo de rota devem corresponder exatamente aos nomes dos parâmetros do método de ação, por exemplo, para a rota definida como {controller} / {action} / {artistName} / {apikey}, o método de ação deve ter a assinatura public ActionResult MyMethod (string artistName, string apikey)
Sudhanshu Mishra
6
Além disso, verifique se o seu URL não está sendo capturado pela rota padrão antes de atingir a sua rota personalizada. Ele usará a primeira correspondência com base em como você as definiu. No meu caso, eu estava tentando usar a rota "MyController / {year} / {month}" para o padrão do Index, mas a rota {controller} / {action} / {id} estava correspondendo à minha URL (MyController / 2015 / 04), então estava recebendo um 404 porque não existia nenhuma ação com o nome 2015. Mover minha rota personalizada para o topo corrigiu o problema.
Sam
O nome parâmetros na routeconfig não coincidir com a minha assinatura Ação, é por isso que não estava funcionando, eu segui os passos descritos por @dotnetguy e funcionou
pepitomb
26

A partir do MVC 5, você também pode usar o roteamento de atributos para mover a configuração de parâmetros 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 atributo

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

         routes.MapMvcAttributeRoutes();
     } 
 }

Em seguida, 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)
Bernard Vander Beken
fonte
5
Atributo roteamento em ASP.NET MVC Núcleo é descrito na docs.microsoft.com/en-us/aspnet/core/mvc/controllers/...
Bernard Vander Beken
21

Você pode passar parâmetros arbitrários pela cadeia de consulta, mas também pode configurar rotas personalizadas para lidar com isso de uma maneira RESTful:

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

Isso pode ser:

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

Portanto, se alguém usou a seguinte rota:

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

Os levaria para o mesmo lugar que a sua querystring de exemplo.

O exemplo acima é apenas um exemplo e não aplica as regras e restrições de negócios que você precisaria configurar para garantir que as pessoas não 'invadissem' o URL.

George Stocker
fonte