Mesma rota, parâmetros diferentes

(Last Updated On: 13 de junho de 2016)

Esses dias estava fazendo uns testes com o projeto da curso de ASP.NET MVC do Alura e me deparei com a necessidade de ter que buscar um autor por Id ou Nome.

Eu teria então, duas rotas exatamente iguais, mas com tipos de parâmetros diferentes: uma receberia um int e a outra, string:

[Route("/autor/busca/{id}")]
public ActionResult Busca(int id)
{
    IList<Autor> autores = dao.BuscaPorId(id);
    //restante do código
}
[Route("/autor/busca/{nome}")]
public ActionResult Busca(string nome)
{
    IList<Autor> autores = dao.BuscaPorId(id);
    //restante do código
}

Isso quer dizer então que se eu tentar acessar o endereço /autor/busca/5 o framework deve me direcionar para o primeiro método. E para o endereço /autor/busca/gabriel, o segundo método, certo?
Errado!
Se tentarmos acessar qualquer um destes endereços, vai acontecer um erro parecido com esse:

The current request is ambiguous between the following action methods:  
System.Web.Mvc.ActionResult Metodo(Int32) on type MeuSistema.Controllers.HomeController  
System.Web.Mvc.ActionResult Metodo(System.String) on type MeuSistema.Controllers.HomeController

Neste erro, o framework está te dizendo: cara, você me passou uma url que bate com duas rotas aqui. Eu não sei qual chamar.

Indicando o tipo do parâmetro na rota

[Route("/autor/busca/{id:int}")]
public ActionResult Busca(int id)
{
    IList<Autor> autores = dao.BuscaPorId(id);
    //restante do código
}
[Route("/autor/busca/{nome}")]
public ActionResult Busca(string nome)
{
    IList<Autor> autores = dao.BuscaPorId(id);
    //restante do código
}

Consegue enxergar a diferença?
Na rota do método que recebe um inteiro, adicionamos :int na frente do nome do parâmetro.

Agora, se tentarmos acessar a URL /autor/busca/5 o ASP.NET MVC irá direcionar para o primeiro método, que eu especifiquei que recebe um inteiro, adicionando o :int na frente do nome do parâmetro.
Se passarmos qualquer outro valor que não seja um número inteiro(como /busca/autor/gabriel, /autor/busca/123123testando e /autor/busca/!@autor$%¨$%¨&&) será o outro.

Legal, né?
Confira nosso curso Projeto Completo: Controle Financeiro com Asp.NET MVC 5 🙂

FIQUE POR DENTRO

Desenvolvedor e criador de conteúdo no grupo Caelum. Host do Alura Live.

Sempre aprendendo coisas novas e passando o conhecimento adiante.

Próximo ArtigoMétodos de requisição do HTTP