我正在使用会话状态开发一种简单的购物车。我把一切都搞定了,但我尝试添加添加同一项目的其他单位的功能。我有一个带有CartItem列表的Cart类。每个CartItem都有产品及其数量。使用GET方法的视图获得了一个很好的更新购物车和会话(除了数量,我打算用POST请求修复)。
我尝试了下面的路径,但数量总是停留在0.我在这里看到了类似的帖子,这可能会增加同样的问题。
http://stackoverflow.com/questions/23363813/why-isnt-my-viewmodel-updating
但是它需要Knockout js,我还没有接触到(并且需要在短时间线上完成我的学校项目)。如果有关于淘汰赛的想法,我将非常感激。为清晰起见,下面是简化的代码。
控制器
[HttpPost]
public ActionResult Show(CartViewModel cvm)
{
Cart cart = (Cart)Session["Cart"];
cvm.CartItems = cart.CartItems;
StringBuilder sb = new StringBuilder();
if (TryUpdateModel(cvm))
{
foreach (CartItem c in cvm.CartItems)
{
sb.Append(c.Product.Name); // works
sb.Append(c.Quantity); // always 0 :(
}
}
return RedirectToAction("Index", "Home");
}
查看
@model Project.ViewModels.CartViewModel
@using (Html.BeginForm())
{
foreach (var item in Model.CartItems)
{
@item.Product.Name
<img src="@item.Product.Image" alt="@item.Product.Name"/>
@Html.EditorFor(i => item.Quantity)
}
}
<input type="submit" value="Send" />
}
答案 0 :(得分:1)
您使用foreach
循环会生成重复的id
属性(无效的html)和与您的模型无关的重复name
属性。 Yu需要使用for
循环(属性CartItems
必须为IList<CartItem>
)或自定义EditorTemplate
用于CartItem
类型。
使用for
循环
for(int i = 0; i < Model.CartItems.Count; i++)
{
@Html.DisplayFor(m => m.CartItems[i].Name)
<img src="@Model.CartItems[i].Product.Image" alt="@Model.CartItems[i].Product.Name"/>
@Html.EditorFor(m => m.CartItems[i].Quantity)
}
这将为属性name
生成正确的Quantity
属性,例如
<input name="CartItems[0].Quantity" ...>
<input name="CartItems[1].Quantity" ...>
将绑定到您的模型