How to pass an IEnumerable Model to a Controller?

1

I have a page that correctly lists my records. But I have Html.BeginForm for each line,

@model IEnumerable<Generico.Dominio.TB_POSSIBILIDADE>

    @{
       ViewBag.Title = "";
    }


                @if (Model.Count() > 0)
                {

                    foreach (var item in Model)
                    {

                        using (Html.BeginForm("GravarRegistro", "Possibilidade", FormMethod.Post))
                        {

                            <div class="container">

                                <div class="col-md-3 form-group">
                                    @Html.DisplayFor(c => item.DESCRICAO01) | R$ @Html.DisplayFor(c => item.VALOR01)
                                    @Html.TextBoxFor(c => item.VALORAPOSTA1, new { placeholder = "valor ", @class = "form-control" })
                                </div>


                                <div class="col-md-3 form-group">
                                    @Html.DisplayFor(c => item.DESCRICAO02) | R$ @Html.DisplayFor(c => item.VALOR02)
                                    @Html.TextBoxFor(c => item.VALORAPOSTA2, new { placeholder = "valor ", @class = "form-control" })
                                </div>


                                <div class="col-md-3 form-group">
                                    @Html.DisplayFor(c => item.DESCRICAO03) | R$ @Html.DisplayFor(c => item.VALOR03)
                                    @Html.TextBoxFor(c => item.VALORAPOSTA3, new { placeholder = "valor ", @class = "form-control" })
                                </div>

                            </div>


                            <div class="modal-footer">
                                <div class="col-md-2 form-group">
                                    <input type="submit" name="btnEnviar" id="btnEnviar" value="Enviar para o caixa" class="btn btn-primary" />
                                </div>
                                <div class="col-md-1 form-group">
                                    <input type="reset" name="btnLimpar" id="btnLimpar" value="Limpar" class="btn btn-danger" />
                                </div>
                            </div>



                        }


                    }

                }

Problem: when I am filling in the data and sending the write I have in control: More the table is coming empty:

  public ActionResult GravarRegistro(TB_POSSIBILIDADE tabela)
        {

            try
            {

                string idusuario = (string)Session["idusuario"];
                string titulo    = (string)Session["descricaotitulo"];


                var tTabela = new CaixaAplicacao();
                tTabela.Inseri(idusuario,titulo, tabela.DESCRICAO01,tabela.DESCRICAO02,tabela.DESCRICAO03,
                               tabela.VALOR01,tabela.VALOR02,tabela.VALOR03,tabela.VALORAPOSTA1,tabela.VALORAPOSTA2,
                               tabela.VALORAPOSTA3,tabela.VALORTOTAL1,tabela.VALORTOTALRETORNO );
            }
            catch (Exception)
            {
                TempData["Erro"] = "Não foi possivel gravar o registro.";
                return RedirectToAction("SelecionarPossibilidade", "Possibilidade", new { id = @Session["idpossibilidadde"] });

            }


            return RedirectToAction("SelecionarPossibilidade", "Possibilidade", new { id = @Session["idpossibilidadde"] });
        }

html:generated;

<div class="panel panel-default"> <div class="panel-heading"><small>Paysandu PA x Juventude </small> </div> <div class="panel-heading"><small>27/07/2016 19:30 (quarta-feira) </small> </div> </div> <div class="list-group"> <a href="#" class="list-group-item active"> Vencedor do Encontro </a> <br /> <form action="/Possibilidade/GravarRegistro" method="post"> <div class="container"> <div class="col-md-3 form-group"> Casa | R$ 01,73 <input class="form-control" data-val="true" data-val-number="The field VALORAPOSTA1 must be a number." data-val-required="O campo VALORAPOSTA1 é obrigatório." id="item_VALORAPOSTA1" name="item.VALORAPOSTA1" placeholder="valor " type="text" value="0" /> </div> <div class="col-md-3 form-group"> Empate | R$ 03,60 <input class="form-control" data-val="true" data-val-number="The field VALORAPOSTA2 must be a number." data-val-required="O campo VALORAPOSTA2 é obrigatório." id="item_VALORAPOSTA2" name="item.VALORAPOSTA2" placeholder="valor " type="text" value="0" /> </div> <div class="col-md-3 form-group"> Fora | R$ 04,20 <input class="form-control" data-val="true" data-val-number="The field VALORAPOSTA3 must be a number." data-val-required="O campo VALORAPOSTA3 é obrigatório." id="item_VALORAPOSTA3" name="item.VALORAPOSTA3" placeholder="valor " type="text" value="0" /> </div> </div> <div class="modal-footer"> <div class="col-md-2 form-group"> <input type="submit" name="btnEnviar" id="btnEnviar" value="Enviar para o caixa" class="btn btn-primary" /> </div> <div class="col-md-1 form-group"> <input type="reset" name="btnLimpar" id="btnLimpar" value="Limpar" class="btn btn-danger" /> </div> </div> </form> </div>     
asked by anonymous 28.07.2016 / 18:20

2 answers

1

The Binding is wrong. See id s name and names name.

id="item_VALORAPOSTA1" name="item.VALORAPOSTA1"
id="item_VALORAPOSTA2" name="item.VALORAPOSTA2"
id="item_VALORAPOSTA3" name="item.VALORAPOSTA3"

To work, Binding had to look like this:

id="VALORAPOSTA1" name="VALORAPOSTA1"
id="VALORAPOSTA2" name="VALORAPOSTA2"
id="VALORAPOSTA3" name="VALORAPOSTA3"

This is resolved by putting your form in Partial , for example:

_Formular.cshtml

@model Generico.Dominio.TB_POSSIBILIDADE

@using (Html.BeginForm("GravarRegistro", "Possibilidade", FormMethod.Post))
{
    <div class="container">
        <div class="col-md-3 form-group">
            @Html.DisplayFor(c => Model.DESCRICAO01) | R$ @Html.DisplayFor(c => Model.VALOR01)
            @Html.TextBoxFor(c => Model.VALORAPOSTA1, new { placeholder = "valor ", @class = "form-control" })
        </div>

        <div class="col-md-3 form-group">
            @Html.DisplayFor(c => Model.DESCRICAO02) | R$ @Html.DisplayFor(c => Model.VALOR02)
            @Html.TextBoxFor(c => Model.VALORAPOSTA2, new { placeholder = "valor ", @class = "form-control" })
        </div>

        <div class="col-md-3 form-group">
            @Html.DisplayFor(c => Model.DESCRICAO03) | R$ @Html.DisplayFor(c => Model.VALOR03)
            @Html.TextBoxFor(c => Model.VALORAPOSTA3, new { placeholder = "valor ", @class = "form-control" })
        </div>

    </div>

    <div class="modal-footer">
        <div class="col-md-2 form-group">
            <input type="submit" name="btnEnviar" id="btnEnviar" value="Enviar para o caixa" class="btn btn-primary" />
        </div>
        <div class="col-md-1 form-group">
            <input type="reset" name="btnLimpar" id="btnLimpar" value="Limpar" class="btn btn-danger" />
        </div>
    </div>
}

And foreach :

foreach (var item in Model)
{
    @Html.Partial("_Formulario", item)
}
    
28.07.2016 / 19:59
0

One option would be to change the way you are rendering the text box, rather than:

@Html.TextBoxFor(c => item.VALORAPOSTA1, new { placeholder = "valor ", @class = "form-control" })

Try this:

@Html.TextBox("VALORAPOSTA1", item.VALORAPOSTA1, new { placeholder = "valor ", @class = "form-control" })

By doing so, the name of the control will match the name of your Model class and when you do the POST you will receive the values in Controller .

    
28.07.2016 / 19:37