none
Binding de Listas dentro de ViewModel RRS feed

  • Pergunta

  • Bom dia! Estou com problemas para fazer o Bind de uma lista dentro de uma ViewModel.

    O código da ViewModel segue abaixo, e o tipo em questão é o List<Contato_Telefone> Telefones;

    [Bind(Exclude = "Tipos, Situacoes, TiposTelefone, TiposEmail, TiposEndereco, Estados, Cidades")]
        public class ContatoEnderecoModel
        {
            public Empresa Empresa { get; set; }
            public Fornecedor Fornecedor { get; set; }
            public Cliente Cliente { get; set; }
            public Contato Contato { get; set; }
            public Contato_Email Email { get; set; }
            public Contato_Telefone Telefone { get; set; }
            public Endereco Endereco { get; set; }
            public Cep Cep { get; set; }
            public SelectList Situacoes { get; set; }
            public SelectList Tipos { get; set; }
            public SelectList TiposTelefone { get; set; }
            public SelectList TiposEmail { get; set; }
            public SelectList TiposEndereco { get; set; }
            public SelectList Estados { get; set; }
            public SelectList Cidades { get; set; }
            public List<Contato_Telefone> Telefones { get; set; }
        }

    Eu sei fazer o bing de listas somente, mas quando é uma lista dentro de uma ViewModel eu realmente não consigo.

    Se a intenção fosse o binding apenas de uma lista seria algo tipo:

    <input type="text" name="[0].TELEFONE" value="Model.TELEFONE"/>
    <input type="text" name="[0].ID" value="[0].ID" />
    Agora dessa lista dentro de uma classe, não estou conseguindo o/.

    sexta-feira, 2 de agosto de 2013 15:20

Todas as Respostas

  • Tente assim:

    <input type="text" name="Telefones[0].Telefone" value="12312321"/> <input type="text" name="Telefones[0].ID" value="1" />

    <input type="text" name="Telefones[1].Telefone" value="12312321"/> <input type="text" name="Telefones[1].ID" value="1" />

    Se tiver que gerar dinamicamente leia este post http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/ . Baixar o projeto e olhar o código ajuda muito!


    Ao infinito e além!


    • Editado Fabio R. Luz sexta-feira, 2 de agosto de 2013 16:45 reasons
    sexta-feira, 2 de agosto de 2013 16:43
  • Obrigado pela ajuda! Mas infelizmente não funcionou. Inclusive tentei também desta forma:

    <input type="text" name="Model.Telefones[0].Telefone" value="12312321"/>
    <input type="text" name="Model.Telefones[0].ID" value="1" />
    <input type="text" name="Model.Telefones[1].Telefone" value="12312321"/>
    <input type="text" name="Model.Telefones[1].ID" value="1" />

    E também não funcionou.

    sexta-feira, 2 de agosto de 2013 16:52
  • como não funcionou? TEM QUE FUNCIONAR! sem o "MODEL". Como está a sua action? Você está passando para ela um objeto do tipo COntatoEnderecoModel ? Poste sua action fazendo favor.

    Ao infinito e além!

    sexta-feira, 2 de agosto de 2013 16:58
  • Exatamente! Também estou indignado com isso hehe, tinha que funcionar.

    Uma questão é o seguinte, o bind do mvc não funciona muito bem quando nós temos um action recebendo um objeto e na view temos o atributo name de uma forma não homogênea. Digamos que eu tenha uma ViewModel com um tipo complexo que não seja um List<T> ,  por exemplo.

    <input type="text" value="@Model.Telefone.TELEFONE" name="Model.Telefone.TELEFONE"/>
    
    <input type="text" value="@Model.Telefone.ID" name="Model.Telefone.ID"/>
    
    <input type="text" value="@Model.Telefone.NOME" name="Telefone.NOME"/>

    O Atributo NOME não iria ser reconhecido pois toda a view Trabalho com o name Model.Telefone.PROPRIEDADE e este input tem como atributo name apenas o Telefone.PROPRIEDADE. De qualquer forma eu testei as duas possibilidades do post anterior e não deu certo T_T. O trecho da minha view que segue:

    <div class="row">
    
                            <div class="span2">
                                <div class="editor-label">
                                    <label class="label label-info">
                                        Nome do Contato</label>
                                </div>
                                <div class="editor-field">
                                    @Html.TextBox("Model.Contato.NOME", Model.Contato.NOME, new { @class = "span2" })
                                </div>
                            </div>
                            <div class="span2">
                                <div class="editor-label">
                                    <label class="label label-info">
                                        Tipo de Telefone</label>
                                </div>
                                <div class="editor-field">
                                    @Html.DropDownList("TiposTelefoneCad1", Model.TiposTelefone, new { @class = "span2" })
                                    @Html.Hidden("Model.Telefones[1].TIPO_TELEFONE_ID")
                                </div>
                            </div>
                            <div class="span2">
                                <div class="editor-label">
                                    <label class="label label-info">
                                        Numero</label>
                                </div>
                                <div class="editor-field">
                                    @Html.TextBox("Model.Telefones[1].TELEFONE", Model.Telefones.ElementAt(0).TELEFONE, new { @class = "span2" })
                                </div>
                            </div>
                            <div class="span2">
                                <div class="editor-label">
                                    <label class="label label-info">
                                        Tipo de Telefone</label>
                                </div>
                                <div class="editor-field">
                                    @Html.DropDownList("TiposTelefoneCad2", Model.TiposTelefone, new { @class = "span2" })
                                    @Html.Hidden("Model.Telefones[2].TIPO_TELEFONE_ID")
                                </div>
                            </div>
                            <div class="span2">
                                <div class="editor-label">
                                    <label class="label label-info">
                                        Numero</label>
                                </div>
                                <div class="editor-field">
                                    @Html.TextBox("Model.Telefones[2].TELEFONE", Model.Telefones.ElementAt(1).TELEFONE, new { @class = "span2" })
                                </div>
                            </div>
                            
                        </div>
                        <div class="row">
                            <div class="span2">
                                <div class="editor-label">
                                    <label class="label label-info">
                                        Tipo de Telefone</label>
                                </div>
                                <div class="editor-field">
                                    @Html.DropDownList("TiposTelefoneCad3", Model.TiposTelefone, new { @class = "span2" })
                                    @Html.Hidden("Model.Telefones[3].TIPO_TELEFONE_ID")
                                </div>
                            </div>
                            <div class="span2">
                                <div class="editor-label">
                                    <label class="label label-info">
                                        Numero</label>
                                </div>
                                <div class="editor-field">
                                    @Html.TextBox("Model.Telefones[3].TELEFONE", Model.Telefones.ElementAt(2).TELEFONE, new { @class = "span2" })
                                </div>
                            </div>
    </div>

    E a minha action é:

    public ActionResult Editar(ContatoEnderecoModel model)
            {
                try
                {
                    if (ModelState.IsValid)
                    {
    
                        //Codigo etc..
                    }
                }
                catch (Exception ex)
                {
                    //Codigo etc..
                }
            }

    sexta-feira, 2 de agosto de 2013 17:09
  • Então cara, estranho, do jeito que você esta falando deveria funcionar... entretanto eu nunca utilizei "Model" antes do name.

    Em alguns campos você usou letras maiúsculas, tem certeza que seu model está desse jeito, ou você fez isso só pra dar ênfase no exemplo?

    Ja tentou fazer desta forma?

    @Html.TextBoxFor(i => i.Contato.Nome);


    Ao infinito e além!

    segunda-feira, 5 de agosto de 2013 12:00