Inquiridor
@Html.DropDownListFor() não valoriza o item da minha Model.

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
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"))
- Editado Cesar Mendes da Silva sexta-feira, 4 de outubro de 2013 19:04 correção
-
-
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
-
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.
}
-
-
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.
-
-
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.
-
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
-
[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.