ASP.NET MVC Ajax.BeginForm返回意外结果

时间:2010-02-14 14:00:06

标签: asp.net-mvc ajax

我正在渲染部分视图:

    <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.我的模型已经更新,因为我可以看到在单步执行控制器操作时该项目已被删除,但就好像我的部分视图是没有正确绑定。

任何帮助都将不胜感激。

由于 本

1 个答案:

答案 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"  />
<%} %>