Asp.Net MVC Binding view model with a List

Asked

Viewed 125 times

0

I’m trying to make a Binding of my view, only when the action is called my object filaViewModel comes with the filaViewModel.Validators equal to null.

I’ve tried to pass with

@Html.Hidden("Code", validator. Code)

, but it’s not going.

My view.

@model Api.Web.Areas.Admin.ViewModels.FilaViewModel

@{
    Layout = Layouts.MasterPageForm;
}

@section breadcrumbs{
    @Html.Partial("Breadcrumbs/_Fila")
}

@section notificacao{
    @Html.NotificacaoMensagem(Model?.MensagensAlerta, TipoMensagemNotificacao.Alerta)
    @Html.NotificacaoMensagem(Model?.MensagemSucesso, TipoMensagemNotificacao.Sucesso)
    @Html.NotificacaoMensagem(Model?.MensagensErro, TipoMensagemNotificacao.Falha)
}

@using (Html.BeginForm("Novo", "Fila", FormMethod.Post, new { @class = "main" }))
{
    @Html.AntiForgeryToken()


    <div class="form-group">
        <label class="col-sm-2 col-md-2 col-xs-2 control-label ui-widget">Validadores: </label>
        <div class="row">
            <div class="col-md-10 col-sm-6">
                <table cellpadding="0" cellspacing="0" border="0" class="dataTable">
                    <thead>
                        <tr>
                            <th>Codigo</th>
                            <th>Tipo Validador</th>
                            <th>Versão do Assembly</th>
                            <th>Nome Serviço</th>
                            <th>Incluidos</th>
                        </tr>
                    </thead>
                    <tbody>
                        @if (Model.Validadores != null)
                        {
                            foreach (var validador in Model.Validadores)
                            {
                                <tr>
                                    <td>
                                        @Html.Hidden("Codigo", validador.Codigo)
                                        <span>@validador.Codigo</span>
                                    </td>
                                    <td>
                                        @Html.Hidden("_tipo", validador._tipo)
                                        <span>@validador._tipo</span>
                                    </td>
                                    <td>
                                        @Html.Hidden("Versao.VersaoDoAssembly", validador.Versao.VersaoDoAssembly)

                                        <span>@validador.Versao.VersaoDoAssembly</span>
                                    </td>
                                    <td>
                                        <span>
                                            @Html.Hidden("Versao.Servico.Nome", validador.Versao.Servico.Nome)
                                            @validador.Versao.Servico.Nome
                                        </span>
                                    </td>
                                    <td style="text-align:center">
                                        @Html.CheckBoxFor(model => validador.Selected)
                                    </td>
                                </tr>
                            }
                        }
                    </tbody>
                </table>
            </div>
        </div>
    </div>
    <div class="form-group">
        <div class="rodape-form">
            <a class="btn btBlue" href="@Url.Action("Index", "Fila", new { Area = "Admin" })" title="">@Resources.Botao_Voltar</a>
            <input type="submit" name="submit" class="btn btGreen" value="@Resources.Botao_Salvar" />
        </div>
    </div>
}

My Viewmodel

public class FilaViewModel : ViewModelBase
    {
        public FilaViewModel()
        {
            Alertas = new List<AlertaViewModel>();
            Erros = new List<ErroViewModel>();
            AcoesClient = new List<SelectListItem>();
            TipoDeprocessamentos = new List<SelectListItem>();
            TipoDeValidadores = new List<SelectListItem>();
            TodasFilas = new List<SelectListItem>();
            ExecutoresClient = new List<SelectListItem>();
            ValidadorClient = new List<SelectListItem>();
        }

        public int Codigo { get; set; }

        public string Descricao { get; set; }

        public Rota Rota { get; set; }

        public ExecutorRest Agente { get; set; }

        public ExecutorRest AgenteDefault { get; set; }

        public IEnumerable<SelectListItem> AcoesClient { get; set; }

        public List<VerboHttp> Acoes { get; set; }

        public List<TipoDeValidador> TipoValidadores { get; set; }

        public List<TipoDeProcessamento> Processamentos { get; set; }

        public IEnumerable<SelectListItem> TipoDeprocessamentos { get; set; }

        public IEnumerable<SelectListItem> TipoDeValidadores { get; set; }

        public List<SelectListItem> TodasFilas { get; set; }

        public string _situacao { get; set; }

        public SituacaoDaFila Situacao
        {
            get { return ExtensaoDeEnumerador.ObterEnumerador<SituacaoDaFila>(_situacao?.Trim()); }
            set { _situacao = value.ObterDescricao(); }
        }

        public string _tipoDeProcessamento { get; set; }

        public TipoDeProcessamento TipoDeProcessamento
        {
            get { return ExtensaoDeEnumerador.ObterEnumerador<TipoDeProcessamento>(_tipoDeProcessamento?.Trim()); }
            set { _tipoDeProcessamento = value.ObterDescricao(); }
        }

        public FilaDadosModel FilaPrincipal { get; set; }

        public ICollection<FilaDadosModel> FilasSecundarias { get; set; }

        public List<ValidadorDadosModel> Validadores { get; set; }

        public List<SelectListItem> ValidadorClient { get; set; }

        public List<SelectListItem> ExecutoresClient { get; set; }

        public List<ExecutorRest> Executores { get; set; }

        public bool PermiteReprocessamento { get; set; }

        public bool GravaAuditoria { get; set; }

        public int TotalRegistros { get; set; }

        public IPagedList<FilaDadosModel> ResultadoPaginado { get; set; }

        public IList<FilaDadosModel> Filas { get; set; }
    }

Controlle

public ActionResult Novo()
{
    Title = Resources.Label_Cadastrar + " - " + Resources.Label_Fila;
    TituloDoFormulario = Resources.Label_Cadastrar + " " + Resources.Label_Fila;

    var filaViewModel = new FilaViewModel();
    filaViewModel.AcoesClient = ExtensaoDeEnumerador.EnumToSelectList<VerboHttp>("U");
    filaViewModel.TipoDeprocessamentos = ExtensaoDeEnumerador.EnumToSelectList<TipoDeProcessamento>("U");
    filaViewModel.TipoDeValidadores = ExtensaoDeEnumerador.EnumToSelectList<TipoDeValidador>("U");

    filaViewModel.Validadores = ListarValidadores("").Validadores;
    return View(filaViewModel);
}

and

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Novo(FilaViewModel filaViewModel)
{
    Title = Resources.Label_Cadastrar + " - " + Resources.Label_Fila;
    TituloDoFormulario = Resources.Label_Cadastrar + " " + Resources.Label_Fila;
    var filas = new List<FilaDadosModel>();


    if (ModelState.IsValid)
    {
        ............... ..
    }

    filaViewModel.Erros.AddRange(ObtemErrosValidacao());

    return View(filaViewModel);
}
  • Could you put your Controller too, please?

  • 1

    @Perozzo, posted.

  • In filaViewModel.Validadores = ListarValidadores("").Validadores; he is no longer null?

  • @Leandroangelo, not loaded normally, even goes to view.

1 answer

1

I decided to change the loop to the FOR.

@if (Model.Validadores != null)
{
    for (var i = 0; i < Model.Validadores.Count; i++)
    {
        <tr>
            <td>
                @Html.HiddenFor(x => x.Validadores[i].Codigo)
                <span>@Model.Validadores[i].Codigo</span>
            </td>
            <td>
                @Html.HiddenFor(x => x.Validadores[i]._tipo)
                <span>@Model.Validadores[i]._tipo</span>
            </td>
            <td>
                @Html.HiddenFor(x => x.Validadores[i].Versao.VersaoDoAssembly)
                <span>@Model.Validadores[i].Versao.VersaoDoAssembly</span>
            </td>
            <td>
                @Html.HiddenFor(x => x.Validadores[i].Versao.Servico.Nome)
                <span>@Model.Validadores[i].Versao.Servico.Nome</span>
            </td>
            <td>
                @Html.CheckBoxFor(x => x.Validadores[i].Selected)
            </td>
        </tr>
    }
}
  • Was it the iteration mode or the use of the helper @Html.HiddenFor()

  • @Leandroangelo,, I think not, I had to change Checkboxfor to use the interaction as well. [i]

Browser other questions tagged

You are not signed in. Login or sign up in order to post.