Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Estou com dúvida no curso de ASP.NET MVC: Desenvolvendo para Web, no exercício do capítulo Lidando com Formulários e o Cadastro de Produtos.

Tenho o seguinte código:

public class Pessoa{ public virtual int Id { get; set; }

public virtual string Nome{ get; set; }

public virtual Curso Curso { get; set; } }

public class Curso{ public virtual int Id { get; set; }

public virtual string Titulo { get; set; } }

No form View tenho uma lista() de cursos disponíveis(já cadastrados no banco de dados) onde o usuário deve selecionar o curso da pessoa. Na action que recebe o form tenho um objeto Pessoa que está sempre recebendo o curso como null. Como posso fazer para que o objeto Pessoa da action de destino do form receba o objeto Pessoa já com seu curso?

Segue estrutura da view: @model Namespace.Models.Pessoa @{ ViewBag.Title = "Pessoa"; }

Pessoa

@using (@Html.BeginForm("Adiciona", "Pessoa", FormMethod.Post)) { @Html.LabelFor(x => x.Nome) @Html.EditorFor(x => x.Nome)

@Html.LabelFor(x => x.Curso) @foreach (Namespace.Models.Curso item in ViewBag.Cursos) {

@item.Titulo } }
2 respostas

Cara quando o form é enviado ele simplesmente monta uma queryString e envia, no seu caso a queryString fica mais ou menos assim:

Adiciona?Nome=valorNome&Curso=valorCurso&item_Id=valoritem_Id

neste caso item_id não faz parte da classe Pessoa por isso ele não sabe montar o obj Curso.

Para fazer isso existem varias estrategias uma delas e receber o id do curso e depois buscar no banco.

e lembre-se sempre é montado uma queryString para ser enviada e se você colocar o nome com parâmetro é montado corretamente

Ex: public ActionResult Index(Pessoa pessoa) ou public ActionResult Index(int Id, String Nome)

solução!

Olá Leandro

Quando queremos enviar um parâmetro em uma requisição web, precisamos definir o atributo name da e não o id do campo. No caso do seu select,você definiu que o id do select é Conta.Id, mas não definiu qual é o name do campo.

Para corrigir seu problema, você precisa apenas definir também o name do select:

<select name="Conta.Id" id="Conta.Id">