none
ActionLink "personalizado" RRS feed

  • Pergunta

  • Pessoal

    Em determinadas situações eu vou precisar gerar links mudando o formato padrão, que é: controller » action » id

    Eu preciso gerar algo como: controller » id » action

    É possível usando o Helper padrão (Html.ActionLink) ou preciso criar um especificamente para isso?!

    Obrigado

    quarta-feira, 25 de maio de 2011 15:51

Respostas

  • Olá Rodrigo,

    Sim, é possível... Basta você definir uma rota alternativa com os parâmetros na ordem que você quer, e definir um critério para que essa rota "especial" seja escolhida apenas quando for apropriado. Uma vez que você defina qual é o critério para decidir qual rota usar (a "normal" ou a "especial"), basta incluir as constraints na rota "especial".

    Por exemplo, imagine que caso o link aponte para uma action chamada "ActionEspecial" de uma controller chamada "ControllerEspecial", então o link deve ser controller » id » action, caso contrário, para todos os outros casos, deve ser o normal: controller » action » id:

    No seu Global.asax.cs, define a rota especial ANTES da rota padrão, mas com as restrições:

    public static void RegisterRoutes(RouteCollection routes)
    {
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
     routes.MapRoute(
      "RotaEspecial",
      "{controller}/{id}/{action}",
      new { id = UrlParameter.Optional },
      new { controller = "ControllerEspecial", action = "ActionEspecial" }
     );
    
     routes.MapRoute(
      "RotaNormal", // É a "Default"
      "{controller}/{action}/{id}",
      new { controller = "Home", action = "Index", id = UrlParameter.Optional }
     );
    }
    
    

    A "RotaEspecial" só vai ser escolhida quando o link apontar para uma action chamada "ActionEspecial" de uma controller chamada "ControllerEspecial", caso contrário ele não seleciona essa rota e segue em frente (selecionando a rota logo abaixo que serve para todos os casos).

    Depois, na hora de utilizar o ActionLink, nada muda... Pois a regra está definida na rota: 

    @Html.ActionLink("Normal", "ActionNormal", "ControllerNormal", new { id = 1 }, null)
    
    @Html.ActionLink("Especial", "ActionEspecial", "ControllerEspecial", new { id = 1 }, null)
    
    

    Abraços,
    Caio Proiete

     


    Caio Proiete
    Microsoft MVP, MCT, MCPD, MCTS, MCSD
    http://caioproiete.net

    domingo, 29 de maio de 2011 20:40
    Moderador
  • Pense no código que gera o link... quando você passar os parâmetros como a framework irá decidir por uma rota ou por outra?

    As rotas são muito parecidas. Isto pode criar muitos problemas relacaionados ao roteamento a medida que o sistema crescer. Acho que a melhor vicê entender melhor a necessidade.


    Allan


    @Allan Fagner:

    O framework escolhe as rotas de acordo com o formato da URL *e* com as restrições que você definir.

    É perfeitamente normal ter rotas parecidas no formato da URL, mas com restrições diferentes.

    As restrições podem ser tão simples como esperar um determinado nome de controller e/ou action, utilizar expressões regulares para ter alguma flexibilidade, ou então criar uma classe que implemente a interface IRouteConstraint onde tem total flexibilidade e pode implementar todas as regras que irão determinar se a rota deve ou não ser selecionada.

    Recomendo a leitura da documentação no site oficial do ASP .NET MVC para ver exemplos de código:

    Creating a Custom Route Constraint (C#)
    http://www.asp.net/mvc/tutorials/creating-a-custom-route-constraint-cs

    Abraços,
    Caio Proiete

     


    Caio Proiete
    Microsoft MVP, MCT, MCPD, MCTS, MCSD
    http://caioproiete.net

    • Marcado como Resposta RodrigoBraga quinta-feira, 30 de junho de 2011 14:50
    domingo, 29 de maio de 2011 20:56
    Moderador

Todas as Respostas

  • Basta você modificar a rota padrão da sua aplicação.

    Feito isso o MVC gera o link corretament a partir da sua rota.

    quarta-feira, 25 de maio de 2011 16:28
    Moderador
  • João

    Mas isso não me atenderia completamente; visto que esse "link personalizado" seria usado apenas para um determinado fim e não para o site inteiro

    quarta-feira, 25 de maio de 2011 17:35
  • Por enquanto estou usando uma solução paliativa que foi a criação de um Helper específico para isso.

    @helper CustomActionLink(string text, string controller, string action, int id)
    {
      var _url = string.Format("{0}/{1}/{2}", controller, id, action);  
      <a href="@_url">@text</a>
    }
    
    Mas de qualquer maneira, uma forma de usar o Helper padrão ainda me parece mais interessante (se possível é claro)

    quarta-feira, 25 de maio de 2011 17:49
  • só interrompendo vcs um pouco eu teria como passar para a actionlink o valor de um input que o usuario informou ?
    Junior
    quarta-feira, 25 de maio de 2011 17:54
  • Sim, pq não poderia? :)
    quarta-feira, 25 de maio de 2011 18:03
  • como faria isso ?
    Junior
    quarta-feira, 25 de maio de 2011 18:47
  • @Html.ActionLink(ValorDinamicoDoSeuInput...

    Alguma coisa por aí...

    Sugiro você abrir um novo tópico, até para potêncializar a chance de respostas efetivas

    quarta-feira, 25 de maio de 2011 19:15
  • Olá RodrigoBraga,

    Não vejo com bons olhos esta sua necessidade. Qual é a motivação? Pense no código que gera o link... quando você passar os parâmetros como a framework irá decidir por uma rota ou por outra?

    As rotas são muito parecidas. Isto pode criar muitos problemas relacaionados ao roteamento a medida que o sistema crescer. Acho que a melhor vicê entender melhor a necessidade.

    Espero ter ajudado.


    Allan
    quarta-feira, 25 de maio de 2011 20:26
  • Olá Rodrigo,

    Sim, é possível... Basta você definir uma rota alternativa com os parâmetros na ordem que você quer, e definir um critério para que essa rota "especial" seja escolhida apenas quando for apropriado. Uma vez que você defina qual é o critério para decidir qual rota usar (a "normal" ou a "especial"), basta incluir as constraints na rota "especial".

    Por exemplo, imagine que caso o link aponte para uma action chamada "ActionEspecial" de uma controller chamada "ControllerEspecial", então o link deve ser controller » id » action, caso contrário, para todos os outros casos, deve ser o normal: controller » action » id:

    No seu Global.asax.cs, define a rota especial ANTES da rota padrão, mas com as restrições:

    public static void RegisterRoutes(RouteCollection routes)
    {
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
     routes.MapRoute(
      "RotaEspecial",
      "{controller}/{id}/{action}",
      new { id = UrlParameter.Optional },
      new { controller = "ControllerEspecial", action = "ActionEspecial" }
     );
    
     routes.MapRoute(
      "RotaNormal", // É a "Default"
      "{controller}/{action}/{id}",
      new { controller = "Home", action = "Index", id = UrlParameter.Optional }
     );
    }
    
    

    A "RotaEspecial" só vai ser escolhida quando o link apontar para uma action chamada "ActionEspecial" de uma controller chamada "ControllerEspecial", caso contrário ele não seleciona essa rota e segue em frente (selecionando a rota logo abaixo que serve para todos os casos).

    Depois, na hora de utilizar o ActionLink, nada muda... Pois a regra está definida na rota: 

    @Html.ActionLink("Normal", "ActionNormal", "ControllerNormal", new { id = 1 }, null)
    
    @Html.ActionLink("Especial", "ActionEspecial", "ControllerEspecial", new { id = 1 }, null)
    
    

    Abraços,
    Caio Proiete

     


    Caio Proiete
    Microsoft MVP, MCT, MCPD, MCTS, MCSD
    http://caioproiete.net

    domingo, 29 de maio de 2011 20:40
    Moderador
  • Pense no código que gera o link... quando você passar os parâmetros como a framework irá decidir por uma rota ou por outra?

    As rotas são muito parecidas. Isto pode criar muitos problemas relacaionados ao roteamento a medida que o sistema crescer. Acho que a melhor vicê entender melhor a necessidade.


    Allan


    @Allan Fagner:

    O framework escolhe as rotas de acordo com o formato da URL *e* com as restrições que você definir.

    É perfeitamente normal ter rotas parecidas no formato da URL, mas com restrições diferentes.

    As restrições podem ser tão simples como esperar um determinado nome de controller e/ou action, utilizar expressões regulares para ter alguma flexibilidade, ou então criar uma classe que implemente a interface IRouteConstraint onde tem total flexibilidade e pode implementar todas as regras que irão determinar se a rota deve ou não ser selecionada.

    Recomendo a leitura da documentação no site oficial do ASP .NET MVC para ver exemplos de código:

    Creating a Custom Route Constraint (C#)
    http://www.asp.net/mvc/tutorials/creating-a-custom-route-constraint-cs

    Abraços,
    Caio Proiete

     


    Caio Proiete
    Microsoft MVP, MCT, MCPD, MCTS, MCSD
    http://caioproiete.net

    • Marcado como Resposta RodrigoBraga quinta-feira, 30 de junho de 2011 14:50
    domingo, 29 de maio de 2011 20:56
    Moderador
  • Perfeito

    Obrigado a todos pela ajuda e ideias.


    quinta-feira, 30 de junho de 2011 14:50