none
Dois models uma view RRS feed

  • Pergunta

  • Boa tarde pessoal!

    Estou tentando implementar dois Models em uma View, e fazendo uma pesquisa, vi que o pessoal costuma fazer isso com ViewModel. Porém não estou conseguindo referenciar o segundo foreach. O erro é o "Referência de objeto não definida para uma instância de um objeto." Alguém sabe o por que esta dando esse erro? Devo estar instanciando errado no controller, mas então como é a forma correta?

    Model

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    
    namespace Taitell_Telecom.Models
    {
        public class ProdutoViewModel
        {
            public ProdutoViewModel(IEnumerable<Produto> Produtos, IEnumerable<ProdutoCategoria> Categoria)
            {
                this.Produtos = Produtos;
                this.Categorias = Categorias;
            }
    
            public IEnumerable<Taitell_Telecom.Models.ProdutoCategoria> Categorias { get; set; }
            public IEnumerable<Taitell_Telecom.Models.Produto> Produtos { get; set; }
        }
    }

    View

    @model Taitell_Telecom.Models.ProdutoViewModel
    @using Taitell_Telecom.Helpers
    
    @{
        Layout = "~/Views/Shared/SiteLayout.cshtml";
        ViewBag.Title = "VitrineProdutos";
    }
    
        @foreach (var item in Model.Produtos)
        {
            <div class="produto">
            
            	<div class="produto_foto">
                <a href="site/Produtos?id=@item.Id">
                <img src="../../../Content/produtos_images/@item.ThumbImagem" alt="@item.Nome" />
                </a>            
                </div>
                
                <div class="produto_txt">
                <h1><strong>@item.Nome</strong></h1>
                <a href="site/Produtos?id=@item.Id" class="link_produto">
                <p>@Html.Raw(item.resume.Trunca(item.Descricao, 80))</p>
                </a>            
                </div>
                
            </div>
        }
    
        @foreach (var categoria in Model.Categorias)
        {
            @Html.ActionLink(@categoria.Nome, "ListaProdutos", "Site", new { categoriaId = categoria.Id }, "")
        }

    Controller

            public ActionResult VitrineProdutos()
            {
                return View(new ProdutoViewModel(db.Produtos.AsEnumerable(), db.Categorias.ToList()));        
            }


    Não importa ao tempo o minuto que passa, mas o minuto que vem.

    segunda-feira, 6 de agosto de 2012 19:42

Respostas

  • Eu tive que ajudar um amigo esses dias mesmo com esse assunto. A minha sugestão é que se você quer que em uma página apareça dois foreachs com dois models porque não seguimentar deixando cada listaem em um modelview diferente?

    Aqui tá o exemplo: https://skydrive.live.com/#cid=D772A349D58A380B&id=D772A349D58A380B%21344

    (só baixar o zip com o nome de "multimodels")

    Se ainda não conseguir fazer me avise. 


    Terei prazer em tentar te ajudar :)

    Sou só uma little padawan que tem sorte de andar com jedis, mas farei o possível por quem precisar :)

    Se quiser: mayumisatox@gmail.com ou @MayogaX

    • Marcado como Resposta Filipemd_s terça-feira, 7 de agosto de 2012 23:45
    segunda-feira, 6 de agosto de 2012 21:22
  • Grande.

    Você consegue enviar o segundo Model (ou os 2 models) com ViewData..

    ViewData["Produtos"] = Produtos
    ViewData["Categorias"] = Categorias

    Coloque esteas dados no Controller e envie para a View.

    Espero que ajude...


    http://fparmezani.wordpress.com

    • Marcado como Resposta Filipemd_s terça-feira, 7 de agosto de 2012 23:45
    segunda-feira, 6 de agosto de 2012 23:43

Todas as Respostas

  • Categoria e ProdutoCategoria não seriam entidades diferentes?

    @Html.ActionLink(@categoria.Nome, "ListaProdutos", "Site", new { categoriaId = categoria.Categoria.Id }, "")

    Você está tentando listar uma categoria mas pegando da tabela ProdutoCategoria, creio que o erro está aí.

    segunda-feira, 6 de agosto de 2012 20:07
    Moderador
  • Então, se eu fizesse isso realmente funcionaria, mas com o foreach desse jeito ele vai escrever toda vez que eu criar um novo produto, o nome da categoria. Quero que o nome da categoria apareça apenas uma vez, para cada categoria criada. Por isso a ideia de trabalhar dois models em uma view...

    Não importa ao tempo o minuto que passa, mas o minuto que vem.

    segunda-feira, 6 de agosto de 2012 20:19
  • Eu tive que ajudar um amigo esses dias mesmo com esse assunto. A minha sugestão é que se você quer que em uma página apareça dois foreachs com dois models porque não seguimentar deixando cada listaem em um modelview diferente?

    Aqui tá o exemplo: https://skydrive.live.com/#cid=D772A349D58A380B&id=D772A349D58A380B%21344

    (só baixar o zip com o nome de "multimodels")

    Se ainda não conseguir fazer me avise. 


    Terei prazer em tentar te ajudar :)

    Sou só uma little padawan que tem sorte de andar com jedis, mas farei o possível por quem precisar :)

    Se quiser: mayumisatox@gmail.com ou @MayogaX

    • Marcado como Resposta Filipemd_s terça-feira, 7 de agosto de 2012 23:45
    segunda-feira, 6 de agosto de 2012 21:22
  • Então, se eu fizesse isso realmente funcionaria, mas com o foreach desse jeito ele vai escrever toda vez que eu criar um novo produto, o nome da categoria.

    Não entendi. Isso só aconteceria se você colocasse o laço (foreach) de categorias dentro da listagem de produtos.

    segunda-feira, 6 de agosto de 2012 21:31
    Moderador
  • Grande.

    Você consegue enviar o segundo Model (ou os 2 models) com ViewData..

    ViewData["Produtos"] = Produtos
    ViewData["Categorias"] = Categorias

    Coloque esteas dados no Controller e envie para a View.

    Espero que ajude...


    http://fparmezani.wordpress.com

    • Marcado como Resposta Filipemd_s terça-feira, 7 de agosto de 2012 23:45
    segunda-feira, 6 de agosto de 2012 23:43