none
Partial Views sem carregar mesmo objeto duas vezes RRS feed

  • Pergunta

  • Pessoal,

    Tenho um app em asp.net MVC que contém gráficos, tabelas, diversos componentes. O mesmo componente pode ser utilizado em mais de uma página e por questão de organização criei partial views diferentes, e vou chamando tudo em uma página. 

    Ou seja, tenho uma view que chama as partial views através de @Html.Action. 

    Ok, está funcionando perfeitamente mas aí eu percebi que os dados que uma tabela utiliza podem ser os mesmos que será utilizado para renderizar um gráfico, por exemplo. E aí percebi que do jeito que está, ele estará carregando dados do banco de dados duas vezes. 

    Como eu faria para continuar utilizando partial views, porém carregando os dados apenas uma vez? 

    Obrigado.

    segunda-feira, 15 de setembro de 2014 13:01

Respostas

  • Se o seu modelo da VIEW principal não tiver os dados da Partial sim, vc pode usar a ViewBag pra passar essa informação.

    Vc pode tanto acessar na PARTIALVIEW a ViewBag direto ou manter a PartialView tipada (@model Seila ) e quando vc for chamar a partial vc passa a viewbag @Html.Partial("Seila", ViewBag.Seila)


    Blog Breno Queiroz – MCP

    terça-feira, 23 de setembro de 2014 18:04

Todas as Respostas

  • rafa_webdeveloper, se não estou enganado corrigi erros assim na minha aplicação utilizando esses códigos.

    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Response.Cache.SetExpires(DateTime.Now.AddSeconds(-1));
    Response.Cache.SetNoStore();

    Adiciono eles em todas as actions que retorno PartialViews.

    Acho que não custa tentar.

    Abraço. 

    segunda-feira, 15 de setembro de 2014 13:05
  • Mas seria só fazer isso e mais nada? 

    Em cada controller que eu chamo, eu instancio uma lista de objetos, chamando o banco de dados novamente. Nesse caso eu não precisaria alterar a programação dos controllers?

    segunda-feira, 15 de setembro de 2014 20:13
  • rafa_webdeveloper, no meu caso eu coloquei so isso, pois, ele limpa o chache do navegador o que pode estar ocorrendo no seu caso.

    Teste em apenas uma controller para ver o resultado se funcionar você adiciona no restante.

    terça-feira, 16 de setembro de 2014 18:29
  • Fernando pelo o que eu entendi me desculpe se eu tiver errado ele quer fazer o "CACHE" e não remover ele, com esse código vc esta garantido que o navegador do cara não vai fazer CACHE.

    Rafa:

    Nos casos que os dados são os mesmo da tabela, pq vc não passa direto para a VIEW em vez de chama a ACTION novamente?

    O Helper Partial aceita voce passar o modelo sem precisar carregar novamente.

    @Html.Partial("{Partial}", model)
    Outra possivel solução seria fazer o CACHE dos dados, so que vai te trazer um trabalho maior pq vc vai precisar gerenciar quando houver novos registros, atualização, exclusão se vc quiser manter a tabela com os dados mais recentes.


    Blog Breno Queiroz – MCP



    • Editado Breno Queiroz terça-feira, 16 de setembro de 2014 19:37
    • Marcado como Resposta rafa_webdeveloper terça-feira, 23 de setembro de 2014 17:53
    • Não Marcado como Resposta rafa_webdeveloper terça-feira, 23 de setembro de 2014 17:53
    terça-feira, 16 de setembro de 2014 19:33
  • Fernando pelo o que eu entendi me desculpe se eu tiver errado ele quer fazer o "CACHE" e não remover ele, com esse código vc esta garantido que o navegador do cara não vai fazer CACHE.

    Rafa:

    Nos casos que os dados são os mesmo da tabela, pq vc não passa direto para a VIEW em vez de chama a ACTION novamente?

    O Helper Partial aceita voce passar o modelo sem precisar carregar novamente.

    @Html.Partial("{Partial}", model)
    Outra possivel solução seria fazer o CACHE dos dados, so que vai te trazer um trabalho maior pq vc vai precisar gerenciar quando houver novos registros, atualização, exclusão se vc quiser manter a tabela com os dados mais recentes.


    Blog Breno Queiroz – MCP



    Breno sugeri a ele limpar o cache justamente porque no meu caso o cache estava zuando os registros apresentando registros não mais existentes e/ou duplicados. 

    Apenas realizar testes, e isso eu deixei bem claro, a solução que pra mim foi valida pode não ser a mesma para outra pessoa.

    quarta-feira, 17 de setembro de 2014 12:30
  • Concerteza Fernando, ate pq existe varias forma de resolver um problema :)

    Cache tem q toma cuidado aonde vai usar, senão acontece isso ae que vc passou!!!

    Obrigado pelo esclarecimento. Abs


    Blog Breno Queiroz – MCP

    quarta-feira, 17 de setembro de 2014 12:36
  • Opa galera, desculpe a demora. 

    Breno, você entendeu bem o que preciso e eu testarei a solução. O único problema, é que uma mesma view, terá de chamar várias views. Então, além do model eu teria que ter viewbags para passar para as outras views, certo?

    Obrigado.

    terça-feira, 23 de setembro de 2014 17:55
  • Se o seu modelo da VIEW principal não tiver os dados da Partial sim, vc pode usar a ViewBag pra passar essa informação.

    Vc pode tanto acessar na PARTIALVIEW a ViewBag direto ou manter a PartialView tipada (@model Seila ) e quando vc for chamar a partial vc passa a viewbag @Html.Partial("Seila", ViewBag.Seila)


    Blog Breno Queiroz – MCP

    terça-feira, 23 de setembro de 2014 18:04
  • Olá Breno, tudo bem?

    Cara, estou tendo problemas na utilização deste modelo. Ele é útil mas seria melhor se cada view tivesse o seu model como model mesmo, e não uma viewbag. Digo isso pois tem casos específicos que estou utilizando Lists de lists(para implementar um gráfico, por exemplo) e ter um objeto como dynamic que é o caso das viewbags fica um pouco complicado.

    Então percebi que não esclareci direito. Na verdade, não utilizo o mesmo objeto como model, mas utilizo a mesma lista de objetos para fazer determinadas operações. Ou seja, simplificando bastante, é como se eu precisasse mandar dois ints como Model para duas partials diferentes. Porém, utilizo a mesma lista de objetos que vem do banco de dados para chegar ao resultado de cada um dos dois inteiros. Não sei se compliquei demais com o que eu falei, e nem sei se isso é possível, mas caso seja possível gostaria de saber como.

    Obrigado novamente


    terça-feira, 30 de setembro de 2014 00:56