« Voltar
em .net c# ASP.NET MVC 5

Definindo o tipo do parâmetro na rota.

A forma mais simples de se fazer customização de rotas no MVC é usando a anotação Route:

public class HomeController : Controller  
{
    [Route("home/metodo/{param}")]
    public ActionResult Metodo(string param)
    {
        //faz algo
    }
}

Agora, e se por alguma razão eu precisasse ter dois métodos com o mesmo nome, mas recebendo tipos diferentes:

public class HomeController : Controller  
{
    [Route("home/metodo/{param}")]
    public ActionResult Metodo(string param)
    {
        //faz algo
    }

    [Route("home/metodo/{param}")]
    public ActionResult Metodo(int param)
    {
        //faz algo
    }
}

Veja que só o que muda é o tipo do parâmetro recebido pelo método, de string pra int.

O que queremos é:
Quando acessarmos a url /home/metodo/1, o método que recebe um inteiro seja executado.
Quando acessarmos a url passando qualquer outro parâmetro que não seja um inteiro, o outro método seja executado.

Se executarmos o código do jeito que está e tentarmos acessar /home/metodo/1 receberemos esse erro na cabeça:

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  

Esse erro basicamente diz: cara, você me passou uma url que bate com duas rotas aqui. Eu não sei qual chamar.

Indicando qual o tipo do parâmetro na rota

A solução pra esse problema na verdade é bem simples:

public class HomeController : Controller  
{
    [Route("home/metodo/{param}")]
    public ActionResult Metodo(string param)
    {
        //faz algo
    }

    [Route("home/metodo/{param:int}")]
    public ActionResult Metodo(int param)
    {
        //faz algo
    }
}

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 /home/metodo/1 o método que recebe um inteiro será executado.
Se passarmos qualquer outro valor que não seja um número inteiro(como /home/metodo/oi, /home/metodo/123vidalokajao456 e /home/metodo/!@ola123tchau) será o outro.

Flexibilidade bacana né? (:


Quer ganhar 15% de desconto pra gastar na Casa do Código e ainda ficar em dia com as minhas postagem e outras promoções e sorteios legais? Assina minha newsletter: http://gabsferreira.com/newsletter/ (:

Se quiser, curta minha página no Face também! O endereço é https://www.facebook.com/devgabsferreira

comments powered by Disqus