none
MVC, Lista por post RRS feed

  • Pregunta

  • Buenos días.

    Necesito pasar por post una lista de objetos, desde la vista al controlador. Pero al intentarlo, en el controlador esta nula.

    ¿Cual es la manera correcta de hacerlo?

    A continuación inserto el código con el cual estoy probando.

    Controlador:

     public ActionResult Index()
     {
       List<TestModel> _lis = new List<TestModel>();
    
       for (int it = 1; it <= 10; it++)
       {
         TestModel nodo = new TestModel();
         nodo.Id = it;
         nodo.Nombre = "Prueba";
    
         lis.Add(nodo);
        }
    
        ViewBag.Lista = _lis;
    
        return View(_lis);
    }
    
    [HttpPost]
    public ActionResult Index(List<TestModel> pList)
    {
       try
       {
         foreach (var it in pList)
         {
             it.Nombre = "LLegó";
         }
    
       }
       catch (Exception e)
       {
         string _error = e.ToString();
       }
    
       return View(pList);
    }
    

    Vista:

    @model List<PruebaMVC.Models.TestModel>
    
    <h2>Index</h2>
    @using (Html.BeginForm("Index", "Test", FormMethod.Post))
    {
        if (Model != null)
        {     
           <table>
                <thead>
                    <tr>
                        <th>
                            Id
                        </th>
                        <th>
                            Nombre
                        </th>
                    </tr>
                </thead>
                <tbody>
                    @foreach (var it in Model)
                    {
                        <tr>
                            <td>@Html.DisplayFor(modelitem => it.Id)</td>
                            <td>@Html.DisplayFor(modelitem => it.Nombre)</td>
                        </tr>
                    }
                </tbody>
            </table>
            @*<input hidden="hidden" id="pList" name="pList" value=@pList/>*@
    
            <button type="submit" >Aceptar</button>
            }
        }
    
    }

    Desde ya muchas gracias.

    lunes, 23 de enero de 2017 20:11

Respuestas

  • Hola GonzaloMicro,

    Pero si estás realizando un POST no deberías usar el DisplayFor, ya que este no es un 'campo' de entrada permitido para el formulario.

    Puedes echarle un ojo al siguiente link donde se explica como lograrlo :

    Model Binding To A List

    Por lo que quedaría de la siguiente forma :

    <tbody>
        @for (var it = 0; it < Model.Count; it++)
        {
            <tr>
                <td>@Html.TextBoxFor(m => Model[it].Id)</td>
                <td>@Html.TextBoxFor(m => Model[it].Nombre)</td>
            </tr>
        }
    </tbody>

    Resultado :

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    lunes, 23 de enero de 2017 20:35

Todas las respuestas

  • Hola GonzaloMicro,

    Pero si estás realizando un POST no deberías usar el DisplayFor, ya que este no es un 'campo' de entrada permitido para el formulario.

    Puedes echarle un ojo al siguiente link donde se explica como lograrlo :

    Model Binding To A List

    Por lo que quedaría de la siguiente forma :

    <tbody>
        @for (var it = 0; it < Model.Count; it++)
        {
            <tr>
                <td>@Html.TextBoxFor(m => Model[it].Id)</td>
                <td>@Html.TextBoxFor(m => Model[it].Nombre)</td>
            </tr>
        }
    </tbody>

    Resultado :

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    lunes, 23 de enero de 2017 20:35
  • hola

    Los DisplayFor() no son valores editables por lo tanto no intervienen en el post que realices a un action, por eso no mapean

    si quieres usar DisplayFor ademas deberias usar un HiddenFor() para que se envie en el post al realizar el submit

    esto si es que no quieres permitir editar los valores, sino como comenta Joel usa el TextBoxFor()

    ----

    Por otro lado porque asignas el ViewBag y ademas envias los datos en el model, debiera ser uno u otor no ambos, esta linea

     ViewBag.Lista = _lis;

    deberias quitarla

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 23 de enero de 2017 21:38
  • Buenos dias.

    Cambie tanto "DisplayFor" por "TextBoxFor" como "foreach" por "for" y ahora si esta pasando los datos por post.

    Muchas gracias.

    martes, 24 de enero de 2017 13:35
  • Buenos días.

    Aplique la solución de Joel C. Naupa Crispín y logre hacer el post.

    En cuanto a la linea " ViewBag.Lista = _lis;", me olvide de borrar esa linea, quedo de unas pruebas que había hecho.

    Muchas gracias.

    martes, 24 de enero de 2017 13:38