Aproveite o mês das
carreiras na Alura

Até 44% OFF

Falta pouco!

00

DIAS

00

HORAS

00

MIN

00

SEG

Mesma rota, parâmetros diferentes

Alura

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:

Banner da Imersão de IA da Alura com Google Gemini. Participe de aulas gratuitas online com certificado. Domine as inovações mais recentes da IA.

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 :)

Veja outros artigos sobre Programação