如何检索表单列表?

时间:2015-06-30 20:19:01

标签: c# asp.net asp.net-mvc

我带有一个包含来自我的数据库的信息的列表。这以用户可以编辑字段的形式显示。我的意图是当他们点击保存按钮时,显示的列表将作为参数传递给方法。我迷路了,出了什么问题?

查看

@model Teste.Models.Produto

@{
    Layout = null;
}
@using (Html.BeginForm("Salvar", "ListaProdutoCab", FormMethod.Post))
{
    <table>
        <thead>
            <tr>
                <th>Selecione</th>
                <th>Produto</th>
                <th>Valor</th>

            </tr>
        </thead> @foreach (var item in Model.listaBebida)
        {
            <tr>
                <td> @Html.CheckBoxFor(modelItem => item.isEditado)</td>
                <td> @Html.TextBoxFor(modelItem => item.produto, new { disabled = "disabled" }) </td>
                <td> @Html.TextBoxFor(modelItem => item.valor) </td>

            </tr>
        }
    </table>
    <div id="modal">
        <div id="botoes">
            <button type="submit">Salvar</button>
        </div>
    </div>
}

我的控制器:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Teste.DAO;
using Teste.Models;

namespace Teste.Controllers
{
    public class ListaProdutoCab: Controller
    {
        //
        // GET: /ListaProdutoCab/
        ListaProdutoService service = new ListaProdutoService();
        Produto produto = new Produto();
        Session usuario = new Session("Genisson", 058);

        List<ObjectMasterProduto> listaProduto= new List<ObjectMasterProduto>();

        public ActionResult ListaProdutoCab()
        {
            return View();
        }

        public ActionResult List()

        {
            service.carregarListaBebida(produto.listaBebida);
            return PartialView(produto);
        }
        [HttpPost]
        public ActionResult Salvar(Produto produto)
        {
            service.Salvar(produto.listaBebida, usuario);
            return RedirectToAction("List");
        }

    }
}

我的实体

Produto

public class Produto
{
    //Chamadas externas
    public Bebida bebida{ get; set; }

    public List<Bebida> listaBebida{ get; set; }

    public Produto()
    {

    }
}

我的另一个实体,类bebida

public class Bebida
{
    //Chamadas externas
    public String nome{ get; set; }

    public Double Valor{ get; set; }

    public Bebida()
    {

    }
}

2 个答案:

答案 0 :(得分:0)

您使用foreach循环会创建重复的id属性(无效的html)和重复的name属性,这些属性与您的模型无关,因此无法绑定到您的模型你提交。将其更改为for循环

@for(int i = 0; i < Model.listaBebida.Count, i++)
{
  <tr>
    <td>@Html.CheckBoxFor(m => m.listaBebida[i].isEditado)</td>
    <td>@Html.TextBoxFor(m => m.listaBebida[i].produto)</td>
    <td>@Html.TextBoxFor(m => m.listaBebida[i].valor) </td>
  </tr>
}

这将生成正确的名称属性,例如

<input type="text" name="listaBebida[0].valor" ... />
<input type="text" name="listaBebida[1].valor" ... />
<input type="text" name="listaBebida[2].valor" ... />

附注:您已包含disabled的{​​{1}}属性,这意味着当您提交时,属性在模型中将为null(禁用的表单控件不会回发值)。如果您想要绑定,请将其设为produto

答案 1 :(得分:-1)

在这些情况下,应该发布某些列表的值,手动从表单获取值而不进行模型绑定。

在您的问题中,我认为您的Bebida类中有一个唯一标识符,例如Bebida.Id,因此示例代码可能是:  这样:

@model Teste.Models.Produto

@{
    Layout = null;
}
@using (Html.BeginForm("Salvar", "ListaProdutoCab", FormMethod.Post))
{
    <table>
        <thead>
            <tr>
                <th>Selecione</th>
                <th>Produto</th>
                <th>Valor</th>

            </tr>
        </thead> @foreach (var item in Model.listaBebida)
        {
            <tr>
                <td> <input type='checkbox' name='chk_@item.Id' /> </td>
                <td> <input type='text' name='produto_@item.Id' /> </td>
                <td> <input type='text' name='valor_@item.Id' /> </td>
            </tr>
        }
    </table>
    <div id="modal">
        <div id="botoes">
            <button type="submit">Salvar</button>
        </div>
    </div>
    }

并在你的行动中:

           [HttpPost]
            public ActionResult Salvar()
            {
              var checkboxkeys = Request.Form.AllKeys.Where(k=>k.Contains("chk_"));
              var CheckedCheckboxesId =checkboxkeys.Select(k=> Convert.ToInt32( k.Substring(4,k.Length-4)));

              var produtokeys = Request.Form.AllKeys.Where(k=>k.Contains("produto_"));
              var produtos= new Dictionary<int,string>();
              foreach(var item in produtokeys )
              {
                  produtos.Add(Convert.ToInt32( item.Substring(8,k.Length-8)),Request.Form[item]);
              }


              var valorkeys = Request.Form.AllKeys.Where(k=>k.Contains("valor_"));
              var valors= new Dictionary<int,string>();
              foreach(var item in valorkeys )
              {
                  valors.Add(Convert.ToInt32( item.Substring(6,k.Length-6)),Request.Form[item]);
              }

              // in here you have CheckedCheckboxesId, produtos and valors and you may want store them.

              return RedirectToAction("List");
            }