2
respostas

Dúvida aula 5 vídeo 4

Pessoal, boa tarde. Resolvi fazer um pouco diferente e estou usando dois modelos numa view. Só que estou tendo um problema, Já tentei de tudo um pouco, porém 1 dos meus modelos está vindo null:

Essa é a minha view model que possui os dois modelos:

using System.Collections.Generic;

namespace ByteBank.Forum.ViewModels
{
    public class EditarFuncoesViewModel
    {
        public UsuarioViewModel Usuario { get; set; }
        public List<UserRolesViewModel> UserRoles { get; set; } = new List<UserRolesViewModel>();

        public EditarFuncoesViewModel()
        {

        }

        public EditarFuncoesViewModel(UsuarioViewModel usuario, List<UserRolesViewModel> userRoles)
        {
            Usuario = usuario;
            UserRoles.AddRange(userRoles);
        }
    }
} 

Essa é a minha view:

@model ByteBank.Forum.ViewModels.UsuarioEditarFuncoesViewModel

@{
    ViewBag.Title = "EditarFuncoes";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Funções do usuário @Html.DisplayFor(model => model.NomeCompleto)</h2>
<h5>@Html.DisplayFor(model => model.UserName)</h5>
<h5>@Html.DisplayFor(model => model.Email)</h5>
<hr />

@using (Html.BeginForm("EditarFuncoes", "Usuario", FormMethod.Post))
{
    <div class="form-horizontal">
        @Html.HiddenFor(model => model.Id)

        <h4>Selecione as funções </h4>
        <br />
        <hr />

        <table>
            <tr>
                <th>
                    Selecionado
                </th>
                <th>
                    Função
                </th>
            </tr>

            @Html.EditorFor(modelo => modelo.Funcoes)

        </table>
        <br />
        <hr />

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Salvar" class="btn btn-default" />
            </div>
        </div>
    </div>
}

Porém no controlador o que vem preenchido é o modelo de usuario, o outro das roles não:

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeSegue o código com o que consegui fazer por hora: https://github.com/karolinagb/ByteBankForum/tree/kgb/ImplementacaoRoles

OBS: Buscando soluções aqui percebi que fazendo com laço for ao invés de foreach na view, funciona e o modelo vem preenchido, porém não consigo entender porque se debugando vi que o for e foreach fazem a mesma coisa. Alguém poderia me explicar? Segue o código com o laço for.

@for (int i = 0; i < Model.UserRoles.Count; i++)
                {

                    @Html.HiddenFor(modelo => Model.UserRoles[i].Id)
                    @Html.HiddenFor(modelo => Model.UserRoles[i].Nome)

                    <tr>
                        <td>
                            <input asp-for="@Model.UserRoles[i].IsSelecionado" class="form-check-input" />
                        </td>
                        <td>
                            @Html.DisplayFor(modelo => Model.UserRoles[i].Nome)
                        </td>
                    </tr>

                }

Att

Karolina Bento

2 respostas

Bom, consegui entender o porque depois de lê alguma vezes esse artigo: http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/

Basicamente o Model binding para funcionar nesse caso eu preciso do for para informar o índice. Pois com o foreach a lista meio que receberia valores sequenciais e não uma instância do modelo para cada linha/índice da lista. Então Model Binding de Listas com tipos primitivos funciona com foreach, mas tipos complexos só funcionar com o For. Está correto o meu entendimento?

Boa Karolina Gomes Bento,

Gostei da solução que você propôs, afinal o resultado é o mesmo porém o código me parece muito mais robusto.

Para que mais pessoas consigam visualizar a sua solução proposta é recomendável com que você venha estar marcando este tópico como solucionado, assim pode estar ajudando ainda mais pessoas :)

Obrigado!!