none
Ajuda Por favor! RRS feed

  • Pergunta

  • Caros, boa tarde!

    Tentei de varias formas, mais não conseguir achar um modo.

    Tenho uma View chama Cliente onde nela eu listo todos os Clientes Cadastrados.

    Até ai tudo bem, só que agora acrescentou mais uma tabela ou model como preferirem chamada ClienteEndereco.

    Onde nela contenho um campo int com o ID do Cliente como vocês podem ver abaixo

    Model ClienteEndereco

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    
    namespace EstudoMVC.Models
    {
        public class ClienteEndereco
        {
            public int ID { get; set; }
            public int IDCliente { get; set; }
            public string Cep { get; set; }
            public string Logadouro { get; set; }
            public string Bairro { get; set; }
            public string Estado { get; set; }
            public string Cidade { get; set; }
    
        }
    }

    Model Cliente

    namespace EstudoMVC.Models
    {
        public class Cliente
        {
            public int ID { get; set; }
            [Required(ErrorMessage = "Favor informar o Nome")]
            [StringLength(150, ErrorMessage = "O Nome deve conter no máximo 150 caracteres")]
            public string Nome { get; set; }
    
            [Display(Name = "E-mail")]
            [Required(ErrorMessage = "Favor informar o E-mail")]
            [StringLength(150, ErrorMessage = "O E-mail deve conter no máximo 150 caracteres")]
            [RegularExpression(".+\\@.+\\..+", ErrorMessage = "Informe um email válido...")]
            public string Email { get; set; }
    
            [Required(ErrorMessage = "Favor informar o Cpf")]
            [StringLength(13, ErrorMessage = "O Cpf deve conter no máximo 13 caracteres")]
    
            public string Cpf { get; set; }
    
            [Required(ErrorMessage = "Favor informar a Data de Nascimento")]
            [Display(Name = "Data de Nascimento")]
            [DisplayFormat(DataFormatString = "mm/dd/yyyy")]
            public DateTime DataNascimento { get; set; }
    
            public string Sexo { get; set; }
            [Required(ErrorMessage = "Favor informar o Telefone")]
    
            public string Telefone { get; set; }
            [Display(Name = "Estado Civil")]
            public string EstadoCivil { get; set; }
    
        }

    o que eu preciso fazer é o seguinte, na listagem de cliente tem que aparecer uma coluna onde vai ser um bit true caso tenha endereço cadastrado false caso não tenha.

    E quando clicar em detalhes, eu preciso que se o cliente tenha endereço cadastrado ele liste o endereço detalhado caso não, que tenha um formulário para ele cadastrar o endereço.

    Vou deixar minha Controller de cliente e minha view de cliente

    Controller Cliente

    using System.Linq;
    using System.Web.Mvc;
    using EstudoMVC.Models;
    
    namespace EstudoMVC.Controllers
    {
        public class ClienteController : Controller
        {
            private Estudo_MVC_DataContext db = new Estudo_MVC_DataContext();
            //
            // GET: /Cliente/
    
            public ActionResult Index()
            {
                ViewData["ClienteEndereco"] = db.ClienteEnderecos.ToList();
                return View(db.Clientes.ToList());
            }
    
            public ActionResult NovoCliente()
            {
                return View();
            }
            [HttpPost]
            public ActionResult NovoCliente(Cliente cliente)
            {
                if (ModelState.IsValid)
                {
                    db.Clientes.Add(cliente);
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }
                return View(cliente);
            }
    
            public ActionResult Detalhe(int id) {
    
                return View();
            }
    
        }
    }
    

    e minha view

    @model IEnumerable<EstudoMVC.Models.Cliente>
    @{
        ViewBag.Title = "Cadastro de Clientes";
    }
    <h2>
        Clientes</h2>
    @Html.ActionLink("Novo Cliente", "NovoCliente")
    <br />
    @{
        WebGrid grid = new WebGrid(Model, defaultSort: null, canPage: true, rowsPerPage: 5);
    }
    @grid.GetHtml(
         columns: grid.Columns(
    
            grid.Column("ID", header: "Código do Cliente", canSort: false),
            grid.Column("Nome", header: "Nome", format: @<b>@item.Nome</b>),
            grid.Column("Email", header: "E-mail", canSort: false),
            grid.Column("Cpf", header: "CPF"),
            grid.Column("DataNascimento", header: "Data de Nascimento", format: @<text>@item.DataNascimento.ToString("d")</text>),
            grid.Column("Sexo", header: "Sexo"),
            grid.Column("Telefone", header: "Telefone", canSort: false),
            grid.Column("EstadoCivil", header: "Estado Civil", canSort: false),
            grid.Column(header: "Detlahe", format: @<text>@Html.RouteLink("Ver", "Detalhe", new { nomelivro = item.Nome.Replace(" ", "_"), id = item.ID })</text>)
                                     )
                                 )

    Obrigado desde já!


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

    segunda-feira, 5 de novembro de 2012 19:57

Respostas

  • Primeiramente sua classe "Cliente" também deve ter uma propriedade do tipo List<ClienteEndereco> ListaEndereco.

    Depois você pode criar um campo calculado do tipo bool no seu ClienteModel:

    public bool HasEndereco 
    {       
       get
       { 
          return this.ListaEndereco.Count() > 0; 
       }
    }
    Isso resolve pelo menos parte do seu problema. 

    terça-feira, 6 de novembro de 2012 04:55
    Moderador
  • João, qual seria a finalidade exatamente do List<> estár na tabela de cliente?

    É como faço para ele ir até a tabela de ClienteEndereco e ver se tem algum endereço para aquele Cliente?

    Obrigado!


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


    1. Para manter a consistência entre os objetos no seu ORM, se ClienteEndereco pertence a um cliente então um cliente pode ter vários endereços ou List<ClienteEndereco>.

    Pra você que está começando eu sugeriria iniciar usando database first, gerar um entity model da base de dados (EDMX) e partir daí. 

    Fica mais fácil para você entender os conceitos do MVC.

    Com o EDMX gerado você pode criar uma PartialClass e adicionar os campos calculados facilmente.

    Suponhamos que você tenha gerado o EDMX com as tabelas que representam as suas classes citadas acima: Cliente e ClienteEndereco.

    Bastaria você acrescentar mais uma classe desta maneira:

    public partial class Cliente()
    {
      public bool TemEndereco 
      {       
         get
         { 
            return this.ClienteEndereco.Count() > 0; 
         }
      }
    }

    A propriedade "TemEndereco" criada na classe parcial acima vai ser propagada junto com cada instancia da classe Cliente no seu sistema.

    Essa técnica pode ser utilizada também para pré-formatar propriedades para serem exibidas nas Views.


    quarta-feira, 7 de novembro de 2012 04:44
    Moderador

Todas as Respostas

  • Primeiramente sua classe "Cliente" também deve ter uma propriedade do tipo List<ClienteEndereco> ListaEndereco.

    Depois você pode criar um campo calculado do tipo bool no seu ClienteModel:

    public bool HasEndereco 
    {       
       get
       { 
          return this.ListaEndereco.Count() > 0; 
       }
    }
    Isso resolve pelo menos parte do seu problema. 

    terça-feira, 6 de novembro de 2012 04:55
    Moderador
  • Certo, ai eu teria que fazer um include na query da listagem certo no meu controller correto?

    Webforms erá tão mais trapico essas coisas :S to sofrendo com o MVC rsrrsrsrsrsrs

    Bom para facilitar a compreenção de todos eu fiz um esboço no paint rsrsrsrsrs

    Listagem

    Listagem

    Detalhes

    Detalhe

    Me desculpem por qualquer coisa, mais estou começando com mvc agora.

    Obrigado!


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

    terça-feira, 6 de novembro de 2012 11:32
  • João, qual seria a finalidade exatamente do List<> estár na tabela de cliente?

    É como faço para ele ir até a tabela de ClienteEndereco e ver se tem algum endereço para aquele Cliente?

    Obrigado!


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


    • Editado Atila Rampazo terça-feira, 6 de novembro de 2012 11:53
    terça-feira, 6 de novembro de 2012 11:34
  • João, qual seria a finalidade exatamente do List<> estár na tabela de cliente?

    É como faço para ele ir até a tabela de ClienteEndereco e ver se tem algum endereço para aquele Cliente?

    Obrigado!


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


    1. Para manter a consistência entre os objetos no seu ORM, se ClienteEndereco pertence a um cliente então um cliente pode ter vários endereços ou List<ClienteEndereco>.

    Pra você que está começando eu sugeriria iniciar usando database first, gerar um entity model da base de dados (EDMX) e partir daí. 

    Fica mais fácil para você entender os conceitos do MVC.

    Com o EDMX gerado você pode criar uma PartialClass e adicionar os campos calculados facilmente.

    Suponhamos que você tenha gerado o EDMX com as tabelas que representam as suas classes citadas acima: Cliente e ClienteEndereco.

    Bastaria você acrescentar mais uma classe desta maneira:

    public partial class Cliente()
    {
      public bool TemEndereco 
      {       
         get
         { 
            return this.ClienteEndereco.Count() > 0; 
         }
      }
    }

    A propriedade "TemEndereco" criada na classe parcial acima vai ser propagada junto com cada instancia da classe Cliente no seu sistema.

    Essa técnica pode ser utilizada também para pré-formatar propriedades para serem exibidas nas Views.


    quarta-feira, 7 de novembro de 2012 04:44
    Moderador
  • Show de bola...

    Eu já havia tentado pelo database first, mais nao entendi como gerava os model, pois prefiro mesmo monta todo o banco, e depois fazer o edmx..

    Mais me corrija se eu estiver enganado, se eu gero um edmx eu nao preciso criar as models tipo Cliente.cs ClienteEndereco.cs ?


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


    • Editado Atila Rampazo quinta-feira, 8 de novembro de 2012 13:23
    quinta-feira, 8 de novembro de 2012 13:14