none
Router RRS feed

  • Pergunta

  • Tive uma dúvida quanto a criar os routers do mvc. 
    Quando eu tenho um produto com nome "produto A", queria criar o router da seguinte maneira "/mostrar/produto-A". A dúvida seria como eu salvaria a rota do produto no banco? Eu criei um campo no meu campo para salvar o "produto-A" e coloquei ele como primary key, para melhorar a busca do endereço.
    Mas na hora de editar o nome do produto, não posso editar o campo do router, por ser primary key.
    Como eu faço no banco para salvar a rota.
    domingo, 8 de novembro de 2009 22:54

Todas as Respostas

  • Stefanio, não entendi direito a sua pergunta. O que me confundiu na verdade foi a parte que você falou "Mas na hora de editar o nome do produto, não posso editar o campo do router, por ser primary key.", pois, as rotas não têm e não deve ter este tipo de ligação com o banco de dados. As rotas são apenas maneiras amigáveis de mostrar a url.

    Este link contém muitas coisas sobre rotas no MVC do ASP.NET
    http://www.asp.net/learn/mvc/#MVC_Routing

    Mas enfim, se for o que eu entendi, você pode fazer assim:

    No seu global.asax, provavelmente haverá um método chamado RegisterRoutes. Nele, adicione o seguinte código
    routes.MapRoute( 
    "ProdutoPorNome", // Nome da rota
    "{controller}/{action}/{nomeProduto}",
    new { action = "mostrar", nomeProduto = string.Empty }
    );
    Você estará dizendo que sempre que o nome do parâmetro da sua action for nomeProduto, você poderá usar

    "/mostrar/produto-A"
    ao invés de
    "/mostrar?nomeProduto=produto-A"
    +.+
    segunda-feira, 9 de novembro de 2009 00:37
  • Tentarei me expressar melhor. Eu tenho um "produto A", na url eu quero que fique da seguinte maneira "mostrar/produto-A". 
    Na função da Action, ele vai pegar um valor string, que seria o produto-A, e tenho que buscar no banco os dados desse produto.

    Como seria a melhor maneira de implementar a busca pelos dados no banco.

    Eu pensei em usar um campo nvarchar com o seguinte nome "ds_caminho_endereco", que salvaria o seguinte "produto-A", e deixei como primary key. Mas se eu tento mudar o nome desse meu produto para produto B, e mudar o campo "ds_caminho_endereco" para produto-B. Ele fala que não pode ser mudado esse campo.

    A dúvida seria qual é a melhor maneira de eu fazer as rotas pra determinado produto, utilizando uma string.



    segunda-feira, 9 de novembro de 2009 01:46
  • Certo Stefanio, a questão da url "mostrar/produto-A " resultar na chamada do método "Mostrar(string nomeProduto) " está resolvida, correto?
    O nome do produto é "produto-A" . Este valor, virá na string nomeProduto que é um parâmetro do seu método.

    Basta fazer um SELECT mais ou menos assim:
    "SELECT campos FROM Produto WHERE Nome = nomeProduto "
    ou algo como:
    Produto produtoConsultado = new RepositorioProduto().Consultar(nomeProduto);

    Agora, se esta não foi sua questão, vou ter que dar alguns tiros pra ver se acerto...

    1. Você quer saber se é melhor usar LINQ(to entities ou to SQL) ou ADO puro?
    2. Você quer saber se é melhor usar Repositório ou outra coisa ou fazer as queries direto?
    3. Por que você quer mudar "produto-A" pra "Produto B" e o que isso tem a ver com rota????
    4. Por acaso você espera que Actions diferentes sejam chamados dependendo do produto passado na URL?

    +.+
    segunda-feira, 9 de novembro de 2009 03:51
  • Stefanio, não entendi direito a sua pergunta. O que me confundiu na verdade foi a parte que você falou "Mas na hora de editar o nome do produto, não posso editar o campo do router, por ser primary key.", pois, as rotas não têm e não deve ter este tipo de ligação com o banco de dados. As rotas são apenas maneiras amigáveis de mostrar a url.

    Este link contém muitas coisas sobre rotas no MVC do ASP.NET
    http://www.asp.net/learn/mvc/#MVC_Routing

    Mas enfim, se for o que eu entendi, você pode fazer assim:

    No seu global.asax, provavelmente haverá um método chamado RegisterRoutes. Nele, adicione o seguinte código
    routes.MapRoute( <br/>
    "ProdutoPorNome" , // Nome da rota<br/>
    "{controller}/{action}/{nomeProduto}" , <br/>
    new { action = "mostrar" , nomeProduto = string .Empty } <br/>
    );
    Você estará dizendo que sempre que o nome do parâmetro da sua action for nomeProduto, você poderá usar

    "/mostrar/produto-A"
    ao invés de
    "/mostrar?nomeProduto=produto-A"
    +.+
    Pessoal,

    Um pequena contribuição.

    Sempre que tenho algum problema com rotas, recorro ao ASP.NET Routing Debugger , do Phil Haack.

    Forte abraço.
    segunda-feira, 9 de novembro de 2009 12:17
    Moderador
  • Stefanio, não entendi direito a sua pergunta. O que me confundiu na verdade foi a parte que você falou "Mas na hora de editar o nome do produto, não posso editar o campo do router, por ser primary key.", pois, as rotas não têm e não deve ter este tipo de ligação com o banco de dados. As rotas são apenas maneiras amigáveis de mostrar a url.

    Este link contém muitas coisas sobre rotas no MVC do ASP.NET
    http://www.asp.net/learn/mvc/#MVC_Routing

    Mas enfim, se for o que eu entendi, você pode fazer assim:

    No seu global.asax, provavelmente haverá um método chamado RegisterRoutes. Nele, adicione o seguinte código
    routes.MapRoute( <br/>
    "ProdutoPorNome" , // Nome da rota<br/>
    "{controller}/{action}/{nomeProduto}" , <br/>
    new { action = "mostrar" , nomeProduto = string .Empty } <br/>
    );
    Você estará dizendo que sempre que o nome do parâmetro da sua action for nomeProduto, você poderá usar

    "/mostrar/produto-A"
    ao invés de
    "/mostrar?nomeProduto=produto-A"
    +.+
    Pessoal,

    Um pequena contribuição.

    Sempre que tenho algum problema com rotas, recorro ao ASP.NET Routing Debugger , do Phil Haack.

    Forte abraço.
    segunda-feira, 9 de novembro de 2009 12:17
    Moderador
  • Então Davi,

    eu tenho uma tabela assim:
    nomeproduto nvarchar(50)
    nomerota nvarchar(50)

    Os dados que eu vo ter no meu banco seria
    nomeproduto = "Produto A"
    nomerota = "produto-A"

    quando eu for fazer um "SELECT * FROM Produto WHERE nomerota = 'produto-a' ", a busca vai ser em todos os registros. Queria alguma dica de como eu devo fazer para melhorar a pesquisa.
    Eu pensei em colocar como primary key o campo nomerota. Para ele criar um índice nesse campo e assim melhorar a busca. Mas caso eu queira editar o nomeproduto para "Produto B", e depois eu tente editar o nomerota para "produto-b", irá ocorrer erro, pois por segurança o banco não deixa editar uma primary key.
    Como você faz no banco para salvar a string de busca.
    terça-feira, 10 de novembro de 2009 03:14
  • Oi Stefanio..

    Olha, sobre isso você teria mais ajuda la na sessão de sql, mas vai minha dica...

    Cria um Index com esses dois campos, eles não vão poder se repetir em pares, por exemplo:
    Rota: "produto-a" Nome: "Produto-a"

    não vai poder existir um outro produto exatamente assim, mas vai poder ter
    Rota: "produto-a" Nome: "Produto-b "
    ou
    Rota: "produto-b" Nome: "Produto-b"

    pra criar um index é só abrir a tabela la no banco de dados e ir na raiz "Indexes" ou algo parecido dependendo da versão do seu sql
    Isso ajudará na pesquisa também, mas como eu já disse, os caras do sql poderão te ajudar mais.. mas vlw

    abraço
    +.+
    quinta-feira, 12 de novembro de 2009 02:41
  • Stefanio, como digo em todos os posts, eu sou meio novato e inexperiente.
    Se eu entendi bem, vc tem uma tabela onde tem 2 campos, nome e rota. Eu acho que se você fizer algumas alterações na configuração da tabela, caso não tenha ainda, poderia ajudar no seu problema.
    Se você garantir que o campo "nomerota" seja único, você poderia utilizar indexação nesse campo, o que criaria um índice em ordem lexográfica.  Após isso, você faz uma pesquisa utilizando a indexação, sendo que o limite da busca seja 1.
    Não sei se resolveria seu caso, mesmo pq eu não sei direito as vantagens da indexação. Eu imagino que após ordenado, a busca deve ser mais rápido, pois pode ser aplicado algoritmos de busca menos complexo.

    Outra maneira de melhorar seu problema, poderia ser colocando o ID do produto na URL, algo do tipo: /mostrar/ProdutoId=XX/NomeProduto=XX ou só /mostrar/ProdutoId=XX

    O que vale é tentar ajudar :D Dê uma pesquisada nas coisas que eu falei e veja sse te ajuda.
    quinta-feira, 12 de novembro de 2009 11:48