Loss of Collection from a View Model to the Controller

Asked

Viewed 89 times

1

I passed an object containing a collection with 2 objects of a controller to the view typed form. Now I would like the view pass this same object to another controller.

The call URL passes the Model as an object but in action called, although the data of the object is there your collection is gone.

What’s going on and how I’m supposed to treat it?

1 answer

1

Summary

Add the fields in the list view, I added as hidden (Hiddenfor)

 @for (int i = 0; i < Model.Dependentes.Count; i++)
        {
            @Html.HiddenFor(model => Model.Dependentes[i].Nome)
            @Html.HiddenFor(model => Model.Dependentes[i].DataNascimento)

        }

Complete Solution

Models of my example

public class Pessoa
 {

    public string Nome { get; set; }
    public DateTime DataNascimento { get; set; }
    public List<Dependente> Dependentes { get; set; }

 }

public class Dependente
{

    public string Nome { get; set; }
    public DateTime DataNascimento { get; set; }

}

Controller

// GET: Pessoa/Edit/
        public ActionResult Edit()
        {
            //Criação do objeto
            Pessoa pessoa = new Pessoa()
            {
                Nome = "José",
                DataNascimento = DateTime.Now,

                Dependentes = new List<Dependente>()
                {

                    new Dependente()
                    {  Nome = "João",
                         DataNascimento = DateTime.Now },

                         new Dependente()
                    {  Nome = "Maria",
                         DataNascimento = DateTime.Now }

                }

            };

            return View(pessoa);
        }

        // POST: Pessoa/Edit/5
        [HttpPost]
        public ActionResult Edit(Pessoa pessoa) // Objeto com lista preenchida
        {
            try
            {
                // Lista de dois itens estão no objeto

                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }

View

@model WebApplication7.Models.Pessoa

@{
    ViewBag.Title = "Edit";
}

<h2>Edit</h2>


@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>Pessoa</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        <div class="form-group">
            @Html.LabelFor(model => model.Nome, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Nome, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.Nome, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.DataNascimento, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.DataNascimento, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.DataNascimento, "", new { @class = "text-danger" })
            </div>
        </div>

@* Aqui está a lista sendo criado campos ocultos na tela para poderem ser postados para o controller*@
        @for (int i = 0; i < Model.Dependentes.Count; i++)
        {
            @Html.HiddenFor(model => Model.Dependentes[i].Nome)
            @Html.HiddenFor(model => Model.Dependentes[i].DataNascimento)

        }

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

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

Browser other questions tagged

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