Mesma rota, parâmetros diferentes
![Mesma rota, parâmetros diferentes](https://www.alura.com.br/artigos/assets/code/mesma-rota-parametros-diferentes.1722020505.png)
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!](assets/alura-matricula-maior-escola-tecnologia-brasil-mais-500-mil-estudantes/matricula-escola-programacao-alura-saiba-mais-versao-mobile.png)
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 :)