none
Dúvida sobre ViewModel RRS feed

  • Pergunta

  • Boa Tarde!

    Estou precisando criar uma view model mais estou tendo problema, pois não consigo compriender muito bem.

    Tenho uma Model Chamada Categorias

    Onde tenho as seguites propiedades

    public int ID {get;set;}
    public int IDParent {get;set;}
    public string NomeCategoria {get;set;}
    public string Descricao {get;set;}

    quando reindenizo na view ele parece da seguinte maneira

    ID IDParent Categoria

    1      0          Camisetas

    1      1          Naruto

    No lugar do IDParent gostária de rendenizar o nome da categoria que a subcategoria pertençe tipo assim

    ID   IDParent           Categoria

    1                              Camisetas

    1      Camisetas        Naruto

    Como posso estar fazendo isso com viewmodel?

    Obrigado!


    "Nunca deixe que os outros te subestimen, mas tambem não seja arrogante seja humilde e prove quem é

    quarta-feira, 21 de novembro de 2012 17:50

Todas as Respostas

  • Sua viewmodel terá que ter uma propriedade do tipo string representando a categoria pai.


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

    quarta-feira, 21 de novembro de 2012 17:53
  • Mais como ela ficaria? tipo assim?

    public class CategoriaViewModel{

    public int ID {get;set;}
    public int IDParent {get;set;}
    public string NomeCategoria {get;set;}
    public string Descricao {get;set;}

    public string CategoriaPai {get;set;}

    }


    "Nunca deixe que os outros te subestimen, mas tambem não seja arrogante seja humilde e prove quem é

    quarta-feira, 21 de novembro de 2012 18:07
  • Sim, ai você precisa mapear o nome da subcategoria no banco para a propriedade "CategoriaPai".

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

    quarta-feira, 21 de novembro de 2012 18:18
  • Seria isso?

    public class CategoriaViewModel{
    
    public int ID {get;set;}
    public int IDParent {get;set;}
    public string NomeCategoria {get;set;}
    public string Descricao {get;set;}
    
    public string CategoriaPai(int ID) {
    
    	CategoriaViewModel.CategoriaPai = db.CategoriaViewModel.where(c => c.IDParent == ID)
    
    }
    
    }



    "Nunca deixe que os outros te subestimen, mas tambem não seja arrogante seja humilde e prove quem é

    quarta-feira, 21 de novembro de 2012 18:27
  • Este código não ia compilar hehe.

    Mas basicamente é isso. Só tenta não colocar código relacionado a banco dentro da própria viewmodel.


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


    • Editado Murilo Kunze quarta-feira, 21 de novembro de 2012 18:39
    quarta-feira, 21 de novembro de 2012 18:39
  • teeeeeeeeenso esse treco huahuauahhua...

    mais ta valendo... ^^


    "Nunca deixe que os outros te subestimen, mas tambem não seja arrogante seja humilde e prove quem é

    quarta-feira, 21 de novembro de 2012 18:41
  • using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using System.Web.Mvc.Ajax;
    using MvcApplication1.Models;
     
    namespace MvcApplication1.Controllers
    {
        // View Model Classes
     
        public class CategoriaViewModel
        {
            public CategoriaViewModel(string CategoriaPai,Categoria Categoria)
            {
                this.CategoriaPai = CategoriaPai;
                this.Categoria = Categoria;
            }
    	public Virtual Categoria {get;set;}
            public string CategoriaPai{get;set;}
        }
     
        // Controller Class
     
        public class Product3Controller : Controller
        {
     
            //
            // GET: /Product3/
     
            public ActionResult Index()
            {
                // Create list of products
                var CatPai = db.Categoria.Where(c => c.IDParent <> 0)
     
                // Create list of categories
                var categories = db.Categoria.ToList();
     
                // Return view
                return View( new CategoriaViewModel( CatPai, categories));
            }
     
        }
    }
    
    Seria Isso? rsrsrs ou proximo a isso?

    "Nunca deixe que os outros te subestimen, mas tambem não seja arrogante seja humilde e prove quem é

    quarta-feira, 21 de novembro de 2012 18:49
  • Isso.

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

    quarta-feira, 21 de novembro de 2012 22:04
  • Estou com apenas mais uma dúvida aqui no caso, eu teria que passar uma lista de Categoria.

    Mais no caso do Catpai, eu passaria uma IEnumerable<> ou passaria so um objeto mesmo?

    Controller

     /// <summary>
            /// Listagem das Categorias
            /// </summary>
            /// <returns></returns>
            public ActionResult Categorias()
            {
                if (Autenticacao.UsuarioLogado())
                {
                    HttpCookie c = Request.Cookies["UserInfo"];
                    ViewData["usuario"] = Criptografia.Descriptografar(c.Values["Nome"]);
                    var Cateogiras = db.Categoria.Where(cc => cc.IDParent == cc.ID).FirstOrDefault();
    
                    return View();
                }
                else
                {
                    Response.Redirect("~/");
                }
                return View("Home", "Index");
            }

    ViewModel

        public class CategoriaViewModel
        {
            public virtual IEnumerable<Categoria> categoria { get; set; }
            public string CategoriaPai { get; set; }
            public CategoriaViewModel() { }
    
            public CategoriaViewModel(string catpai, IEnumerable<Categoria> Categoria)
            {
                this.CategoriaPai = catpai;
                this.categoria = Categoria;
            }
        }


    "Nunca deixe que os outros te subestimen, mas tambem não seja arrogante seja humilde e prove quem é

    quarta-feira, 21 de novembro de 2012 23:05
  • O melhor seria uma string mesmo, caso contrário você faria uma consulta no banco pegando outros dados desnecessários.

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

    quarta-feira, 21 de novembro de 2012 23:26
  • Não vai nem por reza brava nao to conseguindo fazer

    "Nunca deixe que os outros te subestimen, mas tambem não seja arrogante seja humilde e prove quem é

    quarta-feira, 21 de novembro de 2012 23:45
  • Tentei isso, mais quando mandei gerar como tipado ou ate mesmo manual para ver se dava certo, nao consegui gerar as view....

    Essa joça ai q eu fiz ta errada então ainda neh?

    ModelView

        public class CategoriaViewModel
        {
            private IQueryable<Categoria> Cateogiras;
            private List<Categoria> cat;
    
            public CategoriaViewModel() { }
    
    
            public CategoriaViewModel(IQueryable<Categoria> Cateogiras, List<Categoria> cat)
            {
                // TODO: Complete member initialization
                this.Cateogiras = Cateogiras;
                this.cat = cat;
            }
        }

    Controller

            /// <summary>
            /// Listagem das Categorias
            /// </summary>
            /// <returns></returns>
            public ActionResult Categorias()
            {
                if (Autenticacao.UsuarioLogado())
                {
                    HttpCookie c = Request.Cookies["UserInfo"];
                    ViewData["usuario"] = Criptografia.Descriptografar(c.Values["Nome"]);
                    var Cateogiras = db.Categoria.Where(cc => cc.IDParent == cc.ID);
                    List<Categoria> cat = db.Categoria.ToList();
                    var viewModel = new Models.ViewModel.CategoriaViewModel(Cateogiras, cat);
                    return View();
                }
                else
                {
                    Response.Redirect("~/");
                }
                return View("Home", "Index");
            }


    "Nunca deixe que os outros te subestimen, mas tambem não seja arrogante seja humilde e prove quem é

    quarta-feira, 21 de novembro de 2012 23:48
  • Ta faltando os {get;set;} nas propriedades e você passar a viewmodel para a view:

    return View(viewmodel);

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

    quarta-feira, 21 de novembro de 2012 23:55
  •     public class CategoriaViewModel
        {
            private IQueryable<Categoria> Cateogiras{get;set;}
            private List<Categoria> cat{get;set;}
    
            public CategoriaViewModel() { }
    
    
            public CategoriaViewModel(IQueryable<Categoria> Cateogiras, List<Categoria> cat)
            {
                // TODO: Complete member initialization
                this.Cateogiras = Cateogiras;
                this.cat = cat;
            }
        }

    controller

            public ActionResult Categorias()
            {
                if (Autenticacao.UsuarioLogado())
                {
                    HttpCookie c = Request.Cookies["UserInfo"];
                    ViewData["usuario"] = Criptografia.Descriptografar(c.Values["Nome"]);
                    var Cateogiras = db.Categoria.Where(cc => cc.IDParent == cc.ID);
                    List<Categoria> cat = db.Categoria.ToList();
                    var viewModel = new Models.ViewModel.CategoriaViewModel(Cateogiras, cat);
                    return View(viewModel);
                }
                else
                {
                    Response.Redirect("~/");
                }
                return View("Home", "Index");
            }

    e a view reindenizou vazia

    @model IEnumerable<Buscamisas.Models.ViewModel.CategoriaViewModel>
    
    @{
        ViewBag.Title = "Categorias";
    }
    
    <h2>Categorias</h2>
    
    <p>
        @Html.ActionLink("Create New", "Create")
    </p>
    <table>
        <tr>
            <th></th>
        </tr>
    
    @foreach (var item in Model) {
        <tr>
            <td>
                @Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ }) |
                @Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ }) |
                @Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ })
            </td>
        </tr>
    }
    
    </table>
    

    • Editado Atila Rampazo quinta-feira, 22 de novembro de 2012 00:03
    quinta-feira, 22 de novembro de 2012 00:01
  • Coloca:

    @model Buscamisas.Models.ViewModel.CategoriaViewModel

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

    quinta-feira, 22 de novembro de 2012 00:06
  • Tbm não foi!

    "Nunca deixe que os outros te subestimen, mas tambem não seja arrogante seja humilde e prove quem é

    quinta-feira, 22 de novembro de 2012 00:55
  • Suas propriedades devem ser públicas e você deve percorrer Model.Categorias ou Model.cat

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

    quinta-feira, 22 de novembro de 2012 00:58
  • certo, mais no caso murilo e possivel eu percorrer a classe CategoriaViewModel para exibir do modo que eu necessito?

    pq ai ta, supondo que funcione, eu tenho esses 2 caras populados, eu preciso exibir a informação dos 2 na mesma linha da listagem?

    Seria um foreach  para Model.Categorias e dentro desse foreach eu fazer um outro para Model.cat ?

    tipo

    @foreach(var item as Model.Categoria){
    
    <tr>
      <td>@item.ID</td>
      <td>
         @foreach(Var item as Model.cat){
            @item.cat
         }
      </td>
      <td>
         @item.NomeCategoria
       </td>
    </tr>
    }

    fiz aqui mais ou menos de cabeça para ver se eu entendi.


    "Nunca deixe que os outros te subestimen, mas tambem não seja arrogante seja humilde e prove quem é

    quinta-feira, 22 de novembro de 2012 10:37
  • Sim, você faria assim dai.

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

    quinta-feira, 22 de novembro de 2012 10:47
  • hum...anoite tentarei e verei o que aconteçe huauhahuahua...

    Vlw pela força


    "Nunca deixe que os outros te subestimen, mas tambem não seja arrogante seja humilde e prove quem é

    quinta-feira, 22 de novembro de 2012 11:14
  • manooooooooo so muito burro, nao vai.... de jeito nenhum...

    já não sei mais


    "Nunca deixe que os outros te subestimen, mas tambem não seja arrogante seja humilde e prove quem é

    quinta-feira, 22 de novembro de 2012 21:46
  • tem como fazer pra mim ver como ficaria essa view model, pq ja no consigo pensa em mais nada huahuahuahu...q bosta

    "Nunca deixe que os outros te subestimen, mas tambem não seja arrogante seja humilde e prove quem é

    quinta-feira, 22 de novembro de 2012 21:50
  • Me desculpe, mas seu foreach esta estranho:

      @foreach(Var item as Model.cat){
            @item.cat
         }

    O correto é 

      @foreach(Var item in Model.cat){
            @item.cat
         }

    isso se Model.cat é realmente uma coleçao

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Sogi informatique ltée

    quinta-feira, 22 de novembro de 2012 21:55
    Moderador
  • Eu cheguei a corrigir aqui, mais mesmo assim continua dando erro, alterei minha view e meu controller para ficar assim

    View Categoria

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.ComponentModel.DataAnnotations;
    
    namespace Buscamisas.Models
    {
        public class Categoria
        {
            [Key]
            public int ID { get; set; }
            public Nullable<int> IDParent { get; set; }
            [Required(ErrorMessage = "Favor informara a Categoria")]
            [Display(Name = "Categoria")]
            public string NomeCategoria { get; set; }
            [Required(ErrorMessage = "Favor informara a Descrição")]
            [Display(Name = "Descrição")]
            public string Descricao { get; set; }
        }
    }


    ViewModel

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    
    namespace Buscamisas.Models.ViewModel
    {
        public class CategoriaViewModel
        {
            public IQueryable<Categoria> Cateogiras{get;set;}
            public List<Categoria> cat{get;set;}
    
            public CategoriaViewModel() { }
    
    
            public CategoriaViewModel(IQueryable<Categoria> Cateogiras, List<Categoria> cat)
            {
                // TODO: Complete member initialization
                this.Cateogiras = Cateogiras;
                this.cat = cat;
            }
        }
    }


    Controller

    { HttpCookie c = Request.Cookies["UserInfo"]; ViewData["usuario"] = Criptografia.Descriptografar(c.Values["Nome"]); var Cateogiras = db.Categoria.Where(cc => cc.IDParent == cc.ID); List<Categoria> cat = db.Categoria.ToList(); var viewModel = new Models.ViewModel.CategoriaViewModel(Cateogiras, cat); return View(viewModel); } else { Response.Redirect("~/"); } return View("Home", "Index"); }


    View

    @model IEnumerable<Buscamisas.Models.ViewModel.CategoriaViewModel>
    @{
        ViewBag.Title = "Categorias";
        Layout = "~/Views/Shared/_LayoutInterna.cshtml";
    }
    <h2>
        Categorias</h2>
    <p>
        @Html.ActionLink("Create New", "Create")
    </p>
    <table>
        <tr>
            <td>
                ID
            </td>
            <td>
                Categoria Pai
            </td>
            <td>
                Categoria
            </td>
        </tr>
        @foreach (var item in Model)
        {
            <tr>
                @foreach (var item1 in item.Cateogiras)
                {
                    <td>
                        @Html.DisplayFor(modelItem => item1.ID)
                    </td>
                    <td>
                        @foreach (var item2 in item.cat)
                        {
                            @Html.DisplayFor(modelItem => item2.NomeCategoria)
                        }
                    </td>
                }
            </tr>
        }
    </table>
    

    e o erro que me gera é 

    Erro de Servidor no Aplicativo '/'.

    O item de modelo inserido no dicionário é do tipo'Buscamisas.Models.ViewModel.CategoriaViewModel', mas esse dicionário requer um item do tipo 'System.Collections.Generic.IEnumerable`1[Buscamisas.Models.ViewModel.CategoriaViewModel]'.

    Descrição: Ocorreu uma exceção sem tratamento durante a execução da atual solicitação da Web. Examine o rastreamento de pilha para obter mais informações sobre o erro e onde foi originado no código.

    Detalhes da Exceção: System.InvalidOperationException: O item de modelo inserido no dicionário é do tipo'Buscamisas.Models.ViewModel.CategoriaViewModel', mas esse dicionário requer um item do tipo 'System.Collections.Generic.IEnumerable`1[Buscamisas.Models.ViewModel.CategoriaViewModel]'.

    • Editado Atila Rampazo quinta-feira, 22 de novembro de 2012 22:19
    quinta-feira, 22 de novembro de 2012 22:04
  • Atila, seu model precisa ser um 'Buscamisas.Models.ViewModel.CategoriaViewModel' e não um IEnumerable:

    @model Buscamisas.Models.ViewModel.CategoriaViewModel

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

    quinta-feira, 22 de novembro de 2012 22:29
  • mais no caso, a minha view nao  seria mais na base de foreach correto?


    "Nunca deixe que os outros te subestimen, mas tambem não seja arrogante seja humilde e prove quem é

    quinta-feira, 22 de novembro de 2012 22:38
  • Você pode percorrer as propriedades Categorias e cat.

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

    quinta-feira, 22 de novembro de 2012 22:49
  • Murilo fiz uma alteração e so me mostrou um erro e foi ao buildar, nao cheguei a criar a view, na verdade eu meio que refiz

    VW

        public class CategoriaViewModel
        {
            public IQueryable<Categoria> Cateogiras{get;set;}
            public int ID { get; set; }
            public string Parent { get; set; }
    
            public string NomeCategoria { get; set; }
        }

    Controller

                    var categorias = db.Categoria.Where(cc => cc.IDParent == cc.ID);
                    var viewModel = (from x in db.Categoria
                                     where x.IDParent == x.ID
                                     select new CategoriaViewModel
                                     {
                                         ID = x.ID,
                                         Parent = x.NomeCategoria,
                                         Cateogiras = x.Categorias.ToList()
                                     }).ToList();
    
                    return View(viewModel);

    'Buscamisas.Models.Categoria' does not contain a definition for 'Categorias' and no extension method 'Categorias' accepting a first argument of type 'Buscamisas.Models.Categoria' could be found (are you missing a using directive or an assembly reference?)


    "Nunca deixe que os outros te subestimen, mas tambem não seja arrogante seja humilde e prove quem é

    quinta-feira, 22 de novembro de 2012 22:52
  • Você está tentando uma lista de categorias dentro de uma categoria..dá uma boa olhada nesse código.

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

    quinta-feira, 22 de novembro de 2012 22:56
  • Consegui reendenizar, porem não listou nada fiz a query no sql server para ver como eu montei no  controller

    Select * from Categorias where IDParent = ID

    porem ele nao me retorna nada, agora se eu passo o id diretamente

    Select * from Categorias where IDParent = 1 

    ele me retorna 1 registro normal 

    2 1 Naruto Naruto

    ai eu dei uma ajustada nessa query 

    Select * from Categorias where IDParent = 1 or IDParent = 0

    para me trazer o Pai tbm que será sempre IDParent 0

    1 0 Camisetas Camisetas
    2 1 Naruto           Naruto

    Como eu faria essa logica no controller com entity?

    Minha tabela atualmente se encontra assim


    "Nunca deixe que os outros te subestimen, mas tambem não seja arrogante seja humilde e prove quem é


    • Editado Atila Rampazo quinta-feira, 22 de novembro de 2012 23:47
    quinta-feira, 22 de novembro de 2012 23:33
  • Alguma ideia de como posso fazer isso com entity pois não consegui ainda

    "Nunca deixe que os outros te subestimen, mas tambem não seja arrogante seja humilde e prove quem é

    sexta-feira, 23 de novembro de 2012 10:16
  • Da uma olhada nas expressões Lambda

    http://msdn.microsoft.com/pt-br/library/vstudio/bb397687.aspx
    sexta-feira, 23 de novembro de 2012 16:02
  • Nada ainda =/

    "Nunca deixe que os outros te subestimen, mas tambem não seja arrogante seja humilde e prove quem é

    terça-feira, 27 de novembro de 2012 01:11