Inquiridor
Dúvida sobre ViewModel

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 é
Todas as Respostas
-
-
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 é
-
-
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 é
-
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
-
-
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 é
-
-
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 é
-
-
-
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 é
-
-
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
-
-
-
-
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 é
-
-
-
-
-
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 -
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
-
-
-
-
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 é
-
-
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 NarutoComo 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
-
-
-