Mesma rota, parâmetros diferentes

Mesma rota, parâmetros diferentes

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 
}
Banner da Escola de Programação: Matricula-se na escola de Programação. Junte-se a uma comunidade de mais de 500 mil estudantes. Na Alura você tem acesso a todos os cursos em uma única assinatura; tem novos lançamentos a cada semana; desafios práticos. Clique e saiba mais!

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

Veja outros artigos sobre Programação