我有一个绑定到对象购物车的局部视图。Cart 有一个 CartLines 的集合。我的看法如下:
<tbody>
<% foreach (var line in Model.Lines) { %>
<tr>
<td align="center"><%=Html.CatalogImage(line.Product.DefaultImage, 80) %></td>
<td align="left">
<%=Html.ActionLink(line.Product.Name, "Product", "Catalog",
new { productId = line.Product.Id }, new { title = "View " + line.Product.Name })%>
</td>
<td align="right"><%= line.Product.Price.ToString("c")%></td>
<td align="center">
<%=Html.Hidden("lines[" + i + "].key", line.Product.Id) %>
<%=Html.TextBox("lines[" + i + "].value", line.Quantity, new { @class = "quantity" })%>
</td>
<td align="right"><%= (line.LineTotal).ToString("c")%></td>
<td>
<%using (Ajax.BeginForm("RemoveFromCart", "Cart",
new {ProductId = line.Product.Id, returnUrl = ViewData["returnUrl"]},
new AjaxOptions { UpdateTargetId="cart", LoadingElementId="loading" }))
{%>
<input type="image" src="<%=AppHelper.ImageUrl("delete.gif")%>" value="Remove item" />
<%} %>
</td>
</tr>
<% i++; } %>
</tbody>
有两点需要注意。第一个是我每行使用一个表单来删除项目。
第二个是我试图让用户更改订单项的数量,然后单击更新按钮将所有更改传递给控制器操作:
// POST: /Cart/Update
[HttpPost]
public ActionResult Update(Cart cart, IDictionary<int,int> lines, string returnUrl)
{
foreach (var line in lines) {
Product p = _catalogService.GetProduct(line.Key);
cart.UpdateItem(p, line.Value);
}
if (Request.IsAjaxRequest())
return PartialView("Cart", cart);
else
return RedirectToAction("Index", new { returnUrl });
}
请注意,我使用的是字典,因为我只关心产品和数量。我真的不喜欢在调用 cart.UpdateItem 之前必须再次检索产品的事实,但我不知道如何将产品从模型传递到我的操作而不是 id。
然而,主要问题是相当愚蠢地将整个购物车包装在一个表格中,以便我可以回传值,然后花了一个小时想知道为什么事情在 IE 中无法正常工作 -哦!嵌套表格
所以我被困在如何解决这个问题上。我希望能够单独删除项目,但允许用户更改项目数量,然后将所有更改一次传递给控制器。我不能将链接用于我的删除操作,因为我需要使用 javascript 来强制发布,并且一切都必须在没有启用 javascript 的情况下正常工作。
[更新]
更好的解决方案是允许更新我的自定义模型绑定器吗?这样我就可以在我的视图中进行更改并将购物车对象发布回控制器 - 尽管我不确定子集合 (Cart.CartItems) 是否可行。我看过像亚马逊这样的网站,看起来他们将整个购物车包装在一个表单中,并且当禁用 javascript 时,全局更新按钮和单独的删除项目按钮都会返回到相同的操作。任何帮助,将不胜感激。
谢谢,本