我带有一个包含来自我的数据库的信息的列表。这以用户可以编辑字段的形式显示。我的意图是当他们点击保存按钮时,显示的列表将作为参数传递给方法。我迷路了,出了什么问题?
查看
@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()
{
}
}
答案 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");
}