我正在渲染部分视图:
<div id="cart">
<%Html.RenderPartial("Cart", Model); %>
</div>
对于购物车中的每一行,我使用一个表单来删除项目(重要的是,当javascript被禁用时,这是有效的,因此没有Ajax.ActionLink):
<%using (Ajax.BeginForm("RemoveFromCart", "Cart", new AjaxOptions { UpdateTargetId="cart"}))
{%>
<%=Html.Hidden("ProductId", line.Product.Id)%>
<%=Html.Hidden("returnUrl", ViewData["returnUrl"])%>
<input type="image" src="<%=AppHelper.ImageUrl("delete.gif")%>" value="Remove item" />
<%} %>
我的控制器动作:
[HttpPost]
public ActionResult RemoveFromCart(Cart cart, int productId, string returnUrl)
{
Product p = _catalogService.GetProduct(productId);
cart.RemoveLine(p); // TODO - what about if null?
if (Request.IsAjaxRequest())
return PartialView("Cart", cart);
else
return RedirectToAction("Index", new { returnUrl });
}
根据我的理解,启用javascript后,单击“删除”按钮将对操作进行异步发布,并使用更新的部分视图替换“cart”容器的内容。如果禁用js,则会进行完整回发,并再次将用户重定向到索引页。
如果我向购物车添加一些商品并删除商品,则可以正常使用。但是,如果我然后尝试删除另一个项目没有任何反应。原因是在成功删除后查看页面源,包含要删除的产品ID的隐藏字段显示已删除项目的ID。
成功删除前:
<input id="ProductId" name="ProductId" type="hidden" value="6" />
<input id="ProductId" name="ProductId" type="hidden" value="22" />
<input id="ProductId" name="ProductId" type="hidden" value="47" />
删除第三个产品(47)后,其余项目显示隐藏的值字段47.我的模型已经更新,因为我可以看到在单步执行控制器操作时该项目已被删除,但就好像我的部分视图是没有正确绑定。
任何帮助都将不胜感激。
由于 本
答案 0 :(得分:3)
将您的商品ID放在表单扩展名的路由值中,而不是隐藏字段。我认为这样可以完全避免这个问题。
<%using (Ajax.BeginForm("RemoveFromCart", "Cart", new { id = line.Product.Id }, new AjaxOptions { UpdateTargetId="cart"}))
{%>
<%=Html.Hidden("returnUrl", ViewData["returnUrl"])%>
<input type="image" src="<%=AppHelper.ImageUrl("delete.gif")%>" value="Remove item" />
<%} %>