none
Rota sem nome do controller e da action RRS feed

  • Pergunta

  • Gente, eu li em outras dúvidas no fórum que os parametros devem ficar o mais "direita" possivel.

    Maaaas por motivos de SEO e por frescuras eu queria colocar uma estrtura assim:

    parametro1/parametro2

    E tentei dessa maneira:

    routes.MapRoute(

                    "Rota",

                    "{par1}/{par2}",

                    new { controller = "AqueleController", action = "Index"}

                    );

    MAsss não funciona. EU sei, tem toda a parada de ordens e tal, mas eu queria muito fazer desta forma.

    O engraçado é que se eu fizer:

    routes.MapRoute(

                    "Rota",

                    "{par1}/{par2}/controllerLa/actionLa",

                    new { controller = "controllerLa", action = "actionLA"}

                    );

    funciona perfeitamente.

    Uhn, eu sei que eu tô insistindo em um jeito que está errado, mas será que não tem como mesmo?

    terça-feira, 31 de maio de 2011 04:08

Respostas

  • Amiga,

    Da forma que você quer usar, deve funcionar sim, apenas uma única dica ai é que esta rota deve estar "escrita" antes da rota default, caso contrário a rota default irá prevalecer, deverá ficar algo como:

    routes.MapRoute(
                    "Rota",
                    "{par1}/{par2}",
                    new { controller = "AqueleController", action = "Index"}
                    );

    routes.MapRoute(
                    "Default",
                    "{controller}/{action}/{id}",
                    new { controller = "Home", action = "Index"}
                    );

     

    Tente desta forma, se ainda sim tiver problemas, poste mais informações sobre a mensagem que você tem de erro (se for o caso).

    Espero ter ajudado.

     

    Abraços,


    Marcelo Néias MCTS - VSTF 2010

    terça-feira, 31 de maio de 2011 10:42
  • Amigo, agradeço sua resposta....

    Mas o que você sugeriu é uma coisa e seu exemplo de código é outro.

    Olá,

    A resposta do Marcelo está correta (ou pelo menos responde a sua pergunta).

    Se você não quer definir o controller e a action na URL, terá de definir nos parâmetros default, e colocar a rota antes da rota default, como ele sugeriu:

    routes.MapRoute(
      "Rota",
      "{par1}/{par2}",
      new { controller = "Aquele", action = "Index", par1 = UrlParameter.Optional, par2 = UrlParameter.Optional }
    );
    
    


    Abraços,

    Caio Proiete
    http://caioproiete.net

    terça-feira, 31 de maio de 2011 16:47
    Moderador
  • Olá,

    Fiz assim e funcionou: defini um rota para quando não é passado nenhum parâmetro, uma rota com uma constraint com o nome do Controller e, se passar por essa rota chama uma action "Procurar"

    Obs: montei esse código com trechos de código que achei na internet.

     public class MvcApplication : System.Web.HttpApplication
     {
      public static void RegisterRoutes(RouteCollection routes)
      {
       routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
       // cria uma lista com todos os controllers
       var allMvcControllers = from t in Assembly.GetExecutingAssembly().GetExportedTypes()
             where typeof(IController).IsAssignableFrom(t)
             select t.Name.Substring(0, t.Name.Length - 10);   
        
    
       // cria a constraint
       var controllerConstraint = new
       {
        controller = "(" + string.Join("|", allMvcControllers.ToArray()) + ")"
       };
    
       // Rota da página inicial
       routes.MapRoute(
        "Vitrine",
        "",
        new { controller = "Loja", action = "Vitrine" },
        controllerConstraint);
    
       // Rota padrão
       routes.MapRoute(
        "Default",
        "{controller}/{action}/{id}",
        new { action = "Index", id = UrlParameter.Optional },
        controllerConstraint);
    
       // Pega todas as urls
       routes.MapRoute(
        "Procurar",
        "{*url}",
        new { controller = "Loja", action = "Procurar", url = string.Empty });
    
    }
    

     


    João Paulo Gomes http://johnowl.com/
    terça-feira, 31 de maio de 2011 17:15

Todas as Respostas

  • Amiga,

    Da forma que você quer usar, deve funcionar sim, apenas uma única dica ai é que esta rota deve estar "escrita" antes da rota default, caso contrário a rota default irá prevalecer, deverá ficar algo como:

    routes.MapRoute(
                    "Rota",
                    "{par1}/{par2}",
                    new { controller = "AqueleController", action = "Index"}
                    );

    routes.MapRoute(
                    "Default",
                    "{controller}/{action}/{id}",
                    new { controller = "Home", action = "Index"}
                    );

     

    Tente desta forma, se ainda sim tiver problemas, poste mais informações sobre a mensagem que você tem de erro (se for o caso).

    Espero ter ajudado.

     

    Abraços,


    Marcelo Néias MCTS - VSTF 2010

    terça-feira, 31 de maio de 2011 10:42
  • Amigo, agradeço sua resposta....

    Mas o que você sugeriu é uma coisa e seu exemplo de código é outro.

     

    Você quis dizer:

    routes.MapRoute(
                    "Rota",
                    "rota/{par1}/{par2}",
                    new { controller = "AqueleController", action = "Index"}

     

    ?

     

    Se não não tem sentido sua resposta

    terça-feira, 31 de maio de 2011 15:39
  • Outra coisa: isso é ruim pro SEO. É que o google dá mais relevancia as keywords que estiverem mais perto do dominio. =/ e era oq ue eu queria fazer.

    Uhn, não há outro jeito mesmo?

    terça-feira, 31 de maio de 2011 15:49
  • Amigo, agradeço sua resposta....

    Mas o que você sugeriu é uma coisa e seu exemplo de código é outro.

    Olá,

    A resposta do Marcelo está correta (ou pelo menos responde a sua pergunta).

    Se você não quer definir o controller e a action na URL, terá de definir nos parâmetros default, e colocar a rota antes da rota default, como ele sugeriu:

    routes.MapRoute(
      "Rota",
      "{par1}/{par2}",
      new { controller = "Aquele", action = "Index", par1 = UrlParameter.Optional, par2 = UrlParameter.Optional }
    );
    
    


    Abraços,

    Caio Proiete
    http://caioproiete.net

    terça-feira, 31 de maio de 2011 16:47
    Moderador
  • Amigo, agradeço sua resposta....

    Mas o que você sugeriu é uma coisa e seu exemplo de código é outro.

     

    Você quis dizer:

    routes.MapRoute(
                    "Rota",
                    "rota/{par1}/{par2}",
                    new { controller = "AqueleController", action = "Index"}

     

    ?

     

    Se não não tem sentido sua resposta


    Ah, OK... Entendi porque diz que não funciona.

    É preciso tirar o sufixo "Controller" no nome do controller.

    A classe chama-se "AqueleController", mas ao definir o nome do controller na rota, não colocamos o sufixo, e fica "Aquele":

    Abraços,

    Caio Proiete
    http://caioproiete.net
    http://twitter.com/CaioProiete

    terça-feira, 31 de maio de 2011 16:52
    Moderador
  • Olá,

    Fiz assim e funcionou: defini um rota para quando não é passado nenhum parâmetro, uma rota com uma constraint com o nome do Controller e, se passar por essa rota chama uma action "Procurar"

    Obs: montei esse código com trechos de código que achei na internet.

     public class MvcApplication : System.Web.HttpApplication
     {
      public static void RegisterRoutes(RouteCollection routes)
      {
       routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
       // cria uma lista com todos os controllers
       var allMvcControllers = from t in Assembly.GetExecutingAssembly().GetExportedTypes()
             where typeof(IController).IsAssignableFrom(t)
             select t.Name.Substring(0, t.Name.Length - 10);   
        
    
       // cria a constraint
       var controllerConstraint = new
       {
        controller = "(" + string.Join("|", allMvcControllers.ToArray()) + ")"
       };
    
       // Rota da página inicial
       routes.MapRoute(
        "Vitrine",
        "",
        new { controller = "Loja", action = "Vitrine" },
        controllerConstraint);
    
       // Rota padrão
       routes.MapRoute(
        "Default",
        "{controller}/{action}/{id}",
        new { action = "Index", id = UrlParameter.Optional },
        controllerConstraint);
    
       // Pega todas as urls
       routes.MapRoute(
        "Procurar",
        "{*url}",
        new { controller = "Loja", action = "Procurar", url = string.Empty });
    
    }
    

     


    João Paulo Gomes http://johnowl.com/
    terça-feira, 31 de maio de 2011 17:15
  • Obrigado... na verdade eu não tô pondo o sufixo "controller" não, era só prum exemplo.

     

    AGORA eu entendi o que quiseram dizer... quando disseram "por antes da rota default" estavam falando tecnicamente escrever em cima, mesmo, como se fosse ler o arquivo de cima pra baixo.

    É isso? (vou testar isso de noite ^^)

    Isso que dá eu vir do Web Forms assim, só na tentativa e erro u.U

    terça-feira, 31 de maio de 2011 17:51
  • AGORA eu entendi o que quiseram dizer... quando disseram "por antes da rota default" estavam falando tecnicamente escrever em cima, mesmo, como se fosse ler o arquivo de cima pra baixo.

    É isso? (vou testar isso de noite ^^)


    Sim... É exatamente isso. O ASP .NET MVC testa as rotas na ordem que você as adiciona, e a primeira rota que "servir", ele usa... Se você declarar a sua rota personalizada depois da "Default", ela nunca será usada, pois a "Default" sempre serve para qualquer requisição.

    Abraços,

    Caio Proiete
    http://caioproiete.net
    http://twitter.com/CaioProiete

    terça-feira, 31 de maio de 2011 18:02
    Moderador