Usuário com melhor resposta
MVC 4 - Partial View, passagem de parametros.

Pergunta
-
Olá,
Eu tenho o seguinte problema.
Na minha view principal (clientes) eu preciso renderizar uma partial view usando um subset de uma coleçao.
Eu tentei fazer assim, na view:
@Html.RenderPartial("MinhasVendas",Model.Vendas.Where(c=>c.usuarioid== HttpContext.Session["userid"]));
Minhas vendas é simplesmente um grid que lista todas as vendas feitas para o cliente que esta na view e que tenha as vendas realizadas pelo usuario conectado (eu uso uma variavel de sessao para isso)
Nao funcionou.
Minha segunda tentativa foi criar um Controler que retorna uma PartialView
public PartialViewResult GetMinhasVendas(Cliente cliente,int UserID) { List<Vendas> vendas = cliente.Vendas.Where(c => c.usuarioid == UserID); return PartialView("MinhasVendas",vendas); }
e na view eu fiz:
@{Html.RenderAction("GetMinhasVendas","Client",new {cliente = Model, userid=HttpContext.Session["userid"]})}
Ao invez de disaparar a Ac¸ao eu recebo um erro dizendo que a Partial view nao recebeu o modelo correto.
O que eu preciso na verade é na minha view de detalhes do cliente renderizar uma partial view usando como paramtro o cliente que esta sendo exibido (Model da View) e o usuario Conectado (Variavel de sessao)
Com certeza estou faznedo errado porque nenhuma das minhas tentativas deu certo :)
Vou colocar o exemplo na galeria depois que ele esteja estavel. Creio que seja um belo caso de uso de partial view (se funcionar)
Grato pelo atençao
William John Adam Trindade
Analyste-programmeur
----------------------------------------------------------
Sogi informatique ltée- Editado William John Adam TrindadeModerator sexta-feira, 16 de novembro de 2012 20:51
Respostas
-
Você até pode usar o IQueryable como sendo o model da view, porêm não é muito recomendado pois quando você usa ele você pode acabar fazendo consultas no banco diretamente da view; Por isso tambem não é uma boa ideia usar a própria entity para exibir na view.
Para sua segunda pergunta talvez seja interessante colocar este código direto na viewmodel, ou seja:
@{ Html.RenderPartial("MinhasVendas", Model.VendasDoUsuarioLogado); }
Mas afinal, qual erro ocorre nas primeira tentativa?
http://www.linkedin.com/pub/murilo-kunze/44/191/455
- Marcado como Resposta William John Adam TrindadeModerator sábado, 17 de novembro de 2012 23:13
Todas as Respostas
-
William, o model da sua view 'MinhasVendas' no primeiro caso é um List<Venda> (ou ICollection, ou IList, tanto faz) correto?
O primeiro erro é que você precisa fazer o .ToList() depois do .Where, caso contrário você irá passar um IQueryable<Venda> para a partial 'MinhasVendas' e você precisa fazer o RenderPartial como faz o RenderAction: @{Html.RenderPartial()}
Na sua segunda tentativa você está fazendo new {client = Model} mas o correto seria new {cliente = Model} e tambem precisa fazer o ToList(não sei como funcionou no seu código como está agora)
http://www.linkedin.com/pub/murilo-kunze/44/191/455
- Editado Murilo Kunze sexta-feira, 16 de novembro de 2012 19:40
-
Nao funcionou :).. por isso é que eu vim aqui pedir ajuda.
>o model da sua view 'MinhasVendas' no primeiro caso é um List<Venda> (ou ICollection, ou IList, tanto faz) correto?
NA verdade é um IQueryable<Vendas>
Mas eu nao posso usar IQueryable no model?
Eu uso isso para as outras views sem problema.
Outra coisa.. qual dos dois metodos seria o melhor? Fazer a query dentro da view e passar para o modelo (creio que eu esteja delegando uma responsabilidade que nao é da view neste caso) ou usar um controler como na segunda opçao?
Att
William John Adam Trindade
Analyste-programmeur
----------------------------------------------------------
Sogi informatique ltée- Editado William John Adam TrindadeModerator sexta-feira, 16 de novembro de 2012 19:54
-
Você até pode usar o IQueryable como sendo o model da view, porêm não é muito recomendado pois quando você usa ele você pode acabar fazendo consultas no banco diretamente da view; Por isso tambem não é uma boa ideia usar a própria entity para exibir na view.
Para sua segunda pergunta talvez seja interessante colocar este código direto na viewmodel, ou seja:
@{ Html.RenderPartial("MinhasVendas", Model.VendasDoUsuarioLogado); }
Mas afinal, qual erro ocorre nas primeira tentativa?
http://www.linkedin.com/pub/murilo-kunze/44/191/455
- Marcado como Resposta William John Adam TrindadeModerator sábado, 17 de novembro de 2012 23:13
-
Eu creio que eu nao estou sabendo usar a variavel de sessao.. Eu vejo que ela tem conteudo (a variavel de sessao)... se eu executo a Query em um controle (ou direto no model) ela me traz dados, mas quando eu uso direto na view o resultado da query é nulo...
Mas no seu exemplo,
VendasDoUsuarioLogado
Seria uma alteraçao no Model... como neste caso o model vai saber qual é o usuario logado? Teoricamente Model nao pode enxergar a view.. nao seria errado?
Att
William John Adam Trindade
Analyste-programmeur
----------------------------------------------------------
Sogi informatique ltée- Editado William John Adam TrindadeModerator sexta-feira, 16 de novembro de 2012 20:18
-
-
Nao... Realmente MVC é novidade. Agora que vc falou, eu tinha lido sobre ela mas nao cogitei em usar.
Agora eu vi esse post
http://lostechies.com/jimmybogard/2009/06/30/how-we-do-mvc-view-models/
Ok.. parace ser a soluçao para o meu caso.
Eu queria manter o mais limpo possivel fazendo com que cada elemento da arquitetura MVC ficasse restringido a sua responsabilidade, mas vou dar um olhada nisso..
Amanha eu vou fazer novos testes e volto aqui para postar o exemplo final.. vou esperar um pouco para fechar o topico, mas creio que a saida seja por ai mesmo.
Muito obrigado..
William John Adam Trindade
Analyste-programmeur
----------------------------------------------------------
Sogi informatique ltée -
Blz hehe.
Quando você usou o RenderAction, você testou usando aquele código que eu falei?
Usar cliente em vez de client? Eu falo isso pois os nomes devem ser iguais para o Model Bind funcionar.
http://www.linkedin.com/pub/murilo-kunze/44/191/455
-
A nao.. o correto é cliente.. é que eu nao estou com o meu codigo aqui no escritorio, entao resolvi escrecer a mao mesmo...
Era mais para dar uma idéia do que eu estou fazendo.
Att
William John Adam Trindade
Analyste-programmeur
----------------------------------------------------------
Sogi informatique ltée- Editado William John Adam TrindadeModerator sexta-feira, 16 de novembro de 2012 21:12