您好我想抓取所有用户修改数据。
我的问题是为什么控制器无法从我的项目中的View接收模型数据。
请解释导致此错误的原因以及解决方法。
型号:
public class ShoppingCart
{
public List<ShoppingCartItemModel> items = new List<ShoppingCartItemModel>();
public IEnumerable<ShoppingCartItemModel> Items
{
get { return items; }
}
}
public class ShoppingCartItemModel
{
public Product Product
{
get;
set;
}
public int Quantity { get; set; }
}
控制器
[HttpPost]
public RedirectToRouteResult EditFromCart(ShoppingCart MyModel)
{
ShoppingCart cart = GetCart();
foreach (var CartItem in cart.items)
{
foreach (var ReceiveModelItem in MyModel.items)
{
if (CartItem.Product.ProductID == ReceiveModelItem.Product.ProductID)
{
CartItem.Quantity = ReceiveModelItem.Quantity;
}
}
}
return RedirectToAction("Index", "ShoppingCart");
}
查看
@model ShoppingCart
@{
ViewBag.Title = "購物車內容";
}
<h2>Index</h2>
<table class="table">
<thead>
<tr>
<th>
Quantity
</th>
<th>
Item
</th>
<th class="text-right">
Price
</th>
<th class="text-right">
Subtotal
</th>
</tr>
</thead>
<tbody>
@using (Html.BeginForm("EditFromCart", "ShoppingCart", FormMethod.Post))
{
foreach (var item in Model.items)
{
<tr>
<td class="text-center">
@item.Product.ProductName
</td>
<td class="text-center">
@item.Product.Price.ToString("c")
</td>
<td class="text-center">
@( (item.Quantity * item.Product.Price).ToString("c"))
</td>
<td class="text-left">
@Html.EditorFor(model => item.Quantity, null, "UserInputQuantity")
@Html.Hidden("ProductId", item.Product.ProductID)
</td>
</tr>
}
<tr>
<td colspan="3">
<input class="btn btn-warning" type="submit" value="Edit">
</td>
</tr>
}
</tbody>
</table>
答案 0 :(得分:2)
您必须为要绑定的复杂对象中的每个属性显式创建隐藏输入。 IEnumebles和绑定不能直接开箱即用 - 看起来MVC对IList&lt;&gt;有更好的基础支持。和数组,但你仍然需要枚举集合并为每个项目创建隐藏的输入。看看这个link。所以,理想情况下你的观点应该是:
@model ShoppingCart
@{
ViewBag.Title = "購物車內容";
}
<h2>Index</h2>
<table class="table">
<thead>
<tr>
<th>
Quantity
</th>
<th>
Item
</th>
<th class="text-right">
Price
</th>
<th class="text-right">
Subtotal
</th>
</tr>
</thead>
<tbody>
@using (Html.BeginForm("EditFromCart", "ShoppingCart", FormMethod.Post))
{
for (int i = 0; i < Model.items.Count(); ++i)
{
<tr>
<td class="text-center">
@Model.items[i].Product.ProductName
</td>
<td class="text-center">
@Model.items[i].Product.Price.ToString("c")
</td>
<td class="text-center">
@( (Model.items[i].Quantity * Model.items[i].Product.Price).ToString("c"))
</td>
<td class="text-left">
@Html.EditorFor(model => Model.items[i].Quantity)
@Html.HiddenFor(model => Model.items[i].Product.ProductID)
@Html.HiddenFor(model => Model.items[i].Product.ProductName)
@Html.HiddenFor(model => Model.items[i].Product.Price)
</td>
</tr>
}
<tr>
<td colspan="3">
<input class="btn btn-warning" type="submit" value="Edit">
</td>
</tr>
}
</tbody>
</table>
答案 1 :(得分:0)
未正确设置文字和隐藏输入的名称:
@Html.EditorFor(model => item.Quantity, null, "UserInputQuantity")
@Html.Hidden("ProductId", item.Product.ProductID)
如果您检查元素,则可以看到名称为UserInputQuantity
和ProductId
,但它们应该是。{
<{1}}和items[i].Quantity
。
您可以查看以下链接: MVC Model binding of complex objects