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