Usuário com melhor resposta
Partial Views sem carregar mesmo objeto duas vezes

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.
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)
- Marcado como Resposta rafa_webdeveloper terça-feira, 23 de setembro de 2014 23:31
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.
-
-
-
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.
- 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
-
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.
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.
-
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
-
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.
-
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)
- Marcado como Resposta rafa_webdeveloper terça-feira, 23 de setembro de 2014 23:31
-
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