none
@Html.DropDownListFor() não valoriza o item da minha Model. RRS feed

  • Pergunta

  • Galera, tenho essa Drop Down: 

    @Html.DropDownListFor(p=>p.nomeMenuPai, new SelectList(ViewBag.MenuPai, "","Text", "Value"), "Selecione")

    Até aqui beleza pura, o problema é quando eu seleciono ela e dou o post na minha página, o valor nomeMenuPai continua nulo conforme mostra a imagem:

    Selecionei cadastro e postei a página:

    E olha ai o nomeMenuPai = null.

    Esse menu pai se trata de um auto relacionamento como mostra o código abaixo:

     [Table("TB_MENU_PRINCIPAL")]
        public class MenuPrincipal
        {
            // Representa o código do item do Menu 
            [Key]
            [Column("Id_ItemMenu", TypeName = "int")]
            public int idItemMenu { get; set; }
    
            // Representa o nome facilitador de pesquisa
            [Column("NomeParaPesquisa", TypeName = "varchar")]
            [Display(Name = "Nome para Pesquisa")]
            public string nomeParaPesquisa { get; set; }
    
            // Representa o nome da tela a ser acessada pelo item
            [Column("NomeAction", TypeName = "varchar")]
            [Display(Name = "Nome da Action")]
            public string nomeAction { get; set; }
    
            // Representa o nome a ser apresentado no Menu
            [Column("NomeItemMenu", TypeName = "varchar")]
            [Display(Name = "Nome do Item no Menu")]
            public string nomeItemMenu { get; set; }
    
    
            /// <summary>
            /// Auto Relacionamento
            /// </summary>
            [Column("Id_NomeMenuPai", TypeName = "int")]
            public int? idNomePai { get; set; }
    
            // Representa o nome do Menu Pai
            [Column("NomeMenuPai")]
            [Display(Name = "Nome do Menu Pai")]
            public MenuPrincipal nomeMenuPai { get; set; }
    
        }

    Alguém por favor me explique o porque ele não valoriza esse item?

    E como eu posso resolver esse problema?

    Abraço.


    Voce pode encarar um erro como uma besteira a ser esquecida, ou como um resultado que aponta uma nova direcao by Steve Jobs

    sexta-feira, 4 de outubro de 2013 18:32

Todas as Respostas

  • Supondo que a ViewBag.MenuPai tem um List<Entidade> conforme abaixo

    public class Entidade

    {

    public int Id {get;set;}

    public string Nome {get;set;}

    }

    //Mostra o nome e retorna o Id

    @Html.DropDownListFor(p=>p.idMenuPai,new SelectList(ViewBag.MenuPai,"Id","Nome"))

    //Mostra o nome  e retorna o Nome

    @Html.DropDownListFor(p=>p.nomeMenuPai,new SelectList(ViewBag.MenuPai,"Nome","Nome"))


    sexta-feira, 4 de outubro de 2013 19:03
  • Mais uma observação, na sua view tem que ter o seguinte código bem no topo

    @model SeuNameSpace.MenuPrincipal

    Todos Helpers que for AlgumaCoisaFor necessita de uma model declarada na View para que a página fique fortemente tipada.

    sexta-feira, 4 de outubro de 2013 19:08
  • Mais uma observação, na sua view tem que ter o seguinte código bem no topo

    @model SeuNameSpace.MenuPrincipal

    Todos Helpers que for AlgumaCoisaFor necessita de uma model declarada na View para que a página fique fortemente tipada.

    Cesar agradeço o retorno cara. 

    Esqueci de mostrar mas, qualquer outro campo que eu coloque tipado no meu dropdown eh valorizado. 

    Mudei para você ver: 

     @Html.DropDownListFor(p=>p.nomeAction, new SelectList(ViewBag.MenuPai, "","Text", "Value"), "Selecione")

    agora vou mostrar que ele é valorizado normalmente. 

    Então o problema nao é esse. minha view está correta!

    O problema é apenas com o campo nomeMenuPai, que é minha "coluna" de auto relacionamento, e isso já está me deixando louco. 

    Abraço.


    Voce pode encarar um erro como uma besteira a ser esquecida, ou como um resultado que aponta uma nova direcao by Steve Jobs

    sexta-feira, 4 de outubro de 2013 19:38
  • Porque esse campo é um objeto, dessa forma não preenche, se você precisar realmente preencher alguma propriedade dentro do nomeMenuPai, você vai ter que instanciar essa propriedade no contrutor da classe MenuPrincipal e vai ter que mexer no DropDownFor, por exemplo:

    @Html.DropDownListFor(p=>p.nomeMenuPai.Nome ,new SelectList(ViewBag.MenuPai,"Nome","Nome"))

    Na classe MenuPrincipal

    public MenuPrincipal

    {

    public MenuPrincipal()

    {

    this.nomeMenuPai = new MenuPrincipal();

    }

    //

    Propriedades da classe.

    }

    sexta-feira, 4 de outubro de 2013 20:00
  • Agora deu StackOverflow 


    Voce pode encarar um erro como uma besteira a ser esquecida, ou como um resultado que aponta uma nova direcao by Steve Jobs

    sexta-feira, 4 de outubro de 2013 20:24
  • Já sei o que aconteceu, está dando loop infinito.

    MenuPrincipal da um new MenuPrinicpal > new MenuPrincipal > new MenuPrinical e ai vai.

    Retira o construtor, você tem duas opções

    1º e mais simples, criar um campo string NomeMenuPai e coloca o DataAnnotation no campo [NotMapped], dessa forma o campo é ignorado no contexto.

    2º criar uma model com os campos que você precisa.


    sexta-feira, 4 de outubro de 2013 20:35
  • kkkkk Cesar agora deu outro erro. OH MY GOD


    Voce pode encarar um erro como uma besteira a ser esquecida, ou como um resultado que aponta uma nova direcao by Steve Jobs

    sexta-feira, 4 de outubro de 2013 20:41
  • 1º e mais simples, criar um campo string NomeMenuPai e coloca o DataAnnotation no campo [NotMapped], dessa forma o campo é ignorado no contexto.

    Não precisa ser exatamente o mesmo nome acima, der qualquer nome e deixa a propriedade NomeMeuPai como estava que é o MenuPrincipal.

    Tenha em mente o seguinte, o campo que estiver com o [NotMapped] não será salvo no banco de dados e nem vai ser criado, você vai ter que tratar o valor que está retornando.

    sexta-feira, 4 de outubro de 2013 20:46
  • Eu fiz a 1ª opção na minha classe. 

    [Table("TB_MENU_PRINCIPAL")]
        public class MenuPrincipal
        {
          
    
            // Representa o código do item do Menu 
            [Key]
            [Column("Id_ItemMenu", TypeName = "int")]
            public int idItemMenu { get; set; }
    
            // Representa o nome facilitador de pesquisa
            [Column("NomeParaPesquisa", TypeName = "varchar")]
            [Display(Name = "Nome para Pesquisa")]
            public string nomeParaPesquisa { get; set; }
    
            // Representa o nome da tela a ser acessada pelo item
            [Column("NomeAction", TypeName = "varchar")]
            [Display(Name = "Nome da Action")]
            public string nomeAction { get; set; }
    
            // Representa o nome a ser apresentado no Menu
            [Column("NomeItemMenu", TypeName = "varchar")]
            [Display(Name = "Nome do Item no Menu")]
            public string nomeItemMenu { get; set; }
    
            /// <summary>
            /// Auto Relacionamento
            /// </summary>
            [Column("Id_NomeMenuPai", TypeName = "int")]
            public int? idNomePai { get; set; }
    
            // Representa o nome do Menu Pai
            [Column("NomeMenuPai")]
            [Display(Name = "Nome do Menu Pai")]
            [NotMapped]
            public string nomeMenuPai;
    
            
            public MenuPrincipal()
            {
                this.nomeMenuPai = string.Empty;
              
            }
    
        }

    Agora ele deu erro na referência para criar o auto relacionamento.


    Voce pode encarar um erro como uma besteira a ser esquecida, ou como um resultado que aponta uma nova direcao by Steve Jobs

    sexta-feira, 4 de outubro de 2013 20:52
  •  [Table("TB_MENU_PRINCIPAL")]
        public class MenuPrincipal
        {
            // Representa o código do item do Menu 
            [Key]
            [Column("Id_ItemMenu", TypeName = "int")]
            public int idItemMenu { get; set; }

            // Representa o nome facilitador de pesquisa
            [Column("NomeParaPesquisa", TypeName = "varchar")]
            [Display(Name = "Nome para Pesquisa")]
            public string nomeParaPesquisa { get; set; }

            // Representa o nome da tela a ser acessada pelo item
            [Column("NomeAction", TypeName = "varchar")]
            [Display(Name = "Nome da Action")]
            public string nomeAction { get; set; }

            // Representa o nome a ser apresentado no Menu
            [Column("NomeItemMenu", TypeName = "varchar")]
            [Display(Name = "Nome do Item no Menu")]
            public string nomeItemMenu { get; set; }


            /// <summary>
            /// Auto Relacionamento
            /// </summary>
            [Column("Id_NomeMenuPai", TypeName = "int")]
            public int? idNomePai { get; set; }

            // Representa o nome do Menu Pai
            [Column("NomeMenuPai")]
            [Display(Name = "Nome do Menu Pai")]
            public MenuPrincipal nomeMenuPai { get; set; }

             // Representa o nome do Menu Pai temporariamente
            [Column("NomeMenuPai")]
            [Display(Name = "Nome do Menu Pai")]
            [NotMapped]
            public string nomeMenuPaiTemp;

        }

    ai você usa o campo nomeMenuPaiTemp para receber o valor selecionado, mas quando você for salvar, vai ter que tratar esse valor e adicionar uma entidade pai com esse nome, buscar ou deletar já que não sei exatamente o que vai fazer, mas de qualquer forma esse valor vc vai receber ele mas se vc salvar a entidade ele não vai ser salvo.

    sexta-feira, 4 de outubro de 2013 20:57