none
MapRoute - quantidade de parâmetros e nome não fixados RRS feed

  • Pergunta

  • Bem, estou iniciando o desenvolvimento de minha primeira aplicação no formato MVC 2.0. Já utilizei outros frameworks (cake, Zend) em php com desenvolvimento web 2.0 / urls amigáveis.

    O meu problema é que não consigo de forma genérica liberar quantos parâmetros desejar e nomes não fixados para cada ação.

    por ex: nestra string url do MapRoute "{controller}/{action}/{id}"

    controller -> qualquer controle

    action -> qualquer ação

    id -> aqui é o problema, pois deve ser um parâmetro com o nome "id" em qualquer ação a ser chamada.

    sei também que o parâmetro "id" pode ser opicional.


    Nestas duas ações eu gostaria de chamar cada parâmetro com o nome associado a lógica da ação e não chamar ambos de "id". Mas pelo pouco que entendi sobre o MapRoute a minha alternativa para isso seria criar mais duas opções de mapeamento, o que desde já acho inviável, pois poderia facilmente alcançar uns 100 mapeamentos diferentes... e isto seria praticamente impossível de manter.
    public class UfController : AbstractController
    {
      public ActionResult ListaEstados(int idPais)
      {
       return null;
      }
    }
    
    public class CidadeController : AbstractController
    {
    	public ActionResult ListaCidades(int idUf)
      {
       return null;
      }
    }
    
    Isso foi um exemplo simples, mas poderia em ações distintas necessitar de 4,5... parametros que não conteriam os mesmos nomes umas as outras.

    A solução que achei até o momento foi dominio/controle/acao?p1=valorP1&p2=valorP2...pn=valorPn

    sendo cada nome de parâmetro definido na url, o nome do parâmetro a ser procurado na ação e os não definidos para tal ação ignorados ou solicitados separadamente.

    Esta solução seria perfeita se não o uso da "?nome_parametro=valor" o que para mim quebraria o conceito de urls amigáveis. 

    Então pergunto se tem como configurar a minha tabela de roteamento de forma a não fixar o nome do parâmetro? Mesmo que ainda necessário definir a sua quantidade.

    Algo que parecesse com os exemplos abaixo:

    {controller}/{action}/{id|idPais|idUf} -> para se e somente se um dos 3 nomes de parâmetros a ser procurado na ação.
    {controller}/{action}/{.*}{.*} -> para uma ação contendo dois parâmetros de qualquer nome.

    E se a url também pode ser definida como o ex abaixo:

    www.dominio.com/controle/acao/NOME_PARAMETRO1/VALOR_PARAMETRO1/NOME_PARAMETRON/VALOR_PARAMETRON (ZendFramework é um dos que me permitem isso.)

    ao invés de www.dominio.com/controle/acao/VALOR_PARAMETRO1/VALOR_PARAMETRON

    Caso não haja possibilidades até então para tais necessidades, aceito outras sugestões que puderem me passar.

    Agradeço a colaboração de todos!
    • Editado RafaellLins segunda-feira, 1 de novembro de 2010 21:30 Nome da ação corrigido.
    segunda-feira, 1 de novembro de 2010 21:11

Respostas

  • Fala Rafael,

    É possível criar uma parâmetro catchall:

    No Global.asax

    routes.MapRoute(null, "Articles/{*articlePath}",

       new { controller = "Articles", action = "Show" }

    );

    Nesse caso, ao acessar a URL: /Articles/Science/Paleontology/Dinosaurs/Stegosaurus

    Os valores do seu RouteData será:

    • controller: Articles
    • action: Show
    • articlePath: Science/Paleontology/Dinosaurs/Stegosaurus

     


    Forte abraço,

    André Borges Medeiros
    MCT, MCPD, MCTS

    >> Se a resposta solucionar sua dúvida, favor Votar como Útil
    • Marcado como Resposta RafaellLins quinta-feira, 4 de novembro de 2010 04:16
    quarta-feira, 3 de novembro de 2010 20:57
    Moderador

Todas as Respostas

  • Fala Rafael,

    É possível criar uma parâmetro catchall:

    No Global.asax

    routes.MapRoute(null, "Articles/{*articlePath}",

       new { controller = "Articles", action = "Show" }

    );

    Nesse caso, ao acessar a URL: /Articles/Science/Paleontology/Dinosaurs/Stegosaurus

    Os valores do seu RouteData será:

    • controller: Articles
    • action: Show
    • articlePath: Science/Paleontology/Dinosaurs/Stegosaurus

     


    Forte abraço,

    André Borges Medeiros
    MCT, MCPD, MCTS

    >> Se a resposta solucionar sua dúvida, favor Votar como Útil
    • Marcado como Resposta RafaellLins quinta-feira, 4 de novembro de 2010 04:16
    quarta-feira, 3 de novembro de 2010 20:57
    Moderador
  • Fala Rafael,

    É possível criar uma parâmetro catchall:

    No Global.asax

     

    routes.MapRoute(null, "Articles/{*articlePath}",

       new { controller = "Articles", action = "Show" }

    );

    Nesse caso, ao acessar a URL: /Articles/Science/Paleontology/Dinosaurs/Stegosaurus

    Os valores do seu RouteData será:

     

     

    • controller: Articles
    • action: Show
    • articlePath: Science/Paleontology/Dinosaurs/Stegosaurus

     

     

     

     


    Forte abraço,

    André Borges Medeiros
    MCT, MCPD, MCTS

    >> Se a resposta solucionar sua dúvida, favor Votar como Útil

    Perfeito, com base nisto fiz umas modificações para que no momento em que a ação seja chamada os parâmetros estejam preenchidos corretamente.

    String Science = "Paleontology"

    String Dinosaurs = "Stegosaurus"

    para uma posterior chamda a ação ... Show(String Science, String Dinosaurs){...

    quinta-feira, 4 de novembro de 2010 04:15