none
MVC 4 - Partial View, passagem de parametros. RRS feed

  • 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


    sexta-feira, 16 de novembro de 2012 19:23
    Moderador

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

    sexta-feira, 16 de novembro de 2012 20:12

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
    sexta-feira, 16 de novembro de 2012 19:38
  • 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


    sexta-feira, 16 de novembro de 2012 19:52
    Moderador
  • 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

    sexta-feira, 16 de novembro de 2012 20:12
  • 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


    sexta-feira, 16 de novembro de 2012 20:17
    Moderador
  • Não não, esse VendasDoUsuario seria feito na sua ViewModel e não na sua entity.

    Você já chegou a usar ViewModels alguma vez?


    http://www.linkedin.com/pub/murilo-kunze/44/191/455

    sexta-feira, 16 de novembro de 2012 20:25
  • 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

    sexta-feira, 16 de novembro de 2012 20:40
    Moderador
  • 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

    sexta-feira, 16 de novembro de 2012 20:44
  • 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


    sexta-feira, 16 de novembro de 2012 21:01
    Moderador