none
Pasar datos de la View al Controller con un foreach RRS feed

  • Pregunta

  • Buenas tardes,

    Llevo un tiempo peleándome con esto y creo saber cual es el fallo pero no sé como arreglarlo.

    En el formulario de una vista yo tengo 5 TextBox y 5 botones a los que van unidos 5 Jugadores de mi propia clase Jugador.

    ¿Cómo podría hacer para recoger los datos como una List<JugadorNBA> como indico en el model?

    O cómo podría recoger el nombre y el texto del TextBox de puja de usuario?

    En la vista tengo:

    @model IEnumerable<NBAManagerJMdelaCruz.Models.JugadorNBA>

    @{
        ViewBag.Title = "MercadoFichajes";
        Layout = "~/Views/_LayoutJuego.cshtml";
    }

    @foreach (var item in Model) { using (Html.BeginForm("MercadoFichajes", "Juego", FormMethod.Post)) { <tr> <td colspan="2"> @Html.DisplayFor(modelItem => item.nombre) </td> <td> @Html.DisplayFor(modelItem => item.posicion) </td> <td colspan="3"> @Html.DisplayFor(modelItem => item.equipoNBA) </td> <td> @Html.DisplayFor(modelItem => item.valoracion.valoracionTotal) </td> <td> @Html.DisplayFor(modelItem => item.valoracion.valoracionMedia) </td> <td> @Html.DisplayFor(modelItem => item.salarioJugador) </td> <td colspan="2"> @Html.TextBoxFor(modelItem => item.pujaDelUsuario) </td> <td> <input type="submit" value="Pujar" /> </td> </tr> } }


    Y en el controller: 

    public ActionResult MercadoFichajes()
            {
                Random random = new Random();
                Usuario usu = ((Usuario)Session["UsuarioConectado"]);
                if (usu != null)
                {
                    ViewBag.Jugadores = dbController.cargarMercadoFichajes();
                }
                else
                {
                    return RedirectToAction("Login", "Usuario");
                }
    
                return View(ViewBag.Jugadores);
            }
            [HttpPost]
            public ActionResult MercadoFichajes(List<JugadorNBA> jugadores)
            {
                Usuario usu = ((Usuario)Session["UsuarioConectado"]);
                if (usu != null)
                {
                    foreach (JugadorNBA jugador in jugadores)
                    {
                        if (jugador.pujaDelUsuario > 0)
                        {
                            Puja puja = new Puja(jugador.nombre, usu.nickUsuario, jugador.pujaDelUsuario);
                            if (fichajesDBController.pujarPorJugador(puja))
                            {
                                return RedirectToAction("MisPujas", "Juego");
                            }
                            else
                            {
                                return View(jugadores);
                            }
                        }
                    }
                    return View(jugadores);
                }
                else
                {
                    return RedirectToAction("Login", "Usuario");
                }
            }

    El problema lo tengo porque solo debería necesitar que un TextBox estuviera relleno y lo tengo que relacionar con el jugador, pero es que no consigo coger el texto del TextBox sin que se me produzca algún error.

    En resumen, por si no me explico bien, lo que necesitaría de esa vista es que rellenando uno de los TextBox se me crease una "Puja" para ese jugador, recogiendo su @nombre y el TextBox.Text()

    Saludos!


    domingo, 21 de febrero de 2016 17:51

Respuestas

  • Ojo, fíjate bien en cómo has construido la vista. Tienes un bucle que dentro tiene el BeginForm. Esto implica que tienes un Form por cada registro. Cuando pulsas el Submit dentro de ese Form, solo se envían al servidor los campos que están dentro de ese form, es decir un único registro (no toda la lista). Por lo tanto, no es correcto tratarlos de recibir en el lado servidor usando un List<JugadorNBA>, ya que te llega un único JugadorNBA (el resto de la lista no se envía desde el navegador).

    Si realmente necesitas recibirlos todos, deberías cambiar la estructura de la Vista, poniendo primero el Html.BeginForm y luego anidando DENTRO de éste el foreach. Y en este caso, solo debes generar un único botón de Submit al final del bucle, no uno a cada vuelta. Pero si quieres recibir solo un registro, entonces deja la vista como está, y en el Controlador cambia el List<JugadorNBA> por JugadorNBA (y lógicamente quita el bucle en el controlador, ya te llega directamente el jugador sobre el que hicieron Submit).

    domingo, 21 de febrero de 2016 21:13