2

我有一个绑定到对象购物车的局部视图。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 时,全局更新按钮和单独的删除项目按钮都会返回到相同的操作。任何帮助,将不胜感激。

谢谢,本

4

1 回答 1

0

这里只有一种方式,那就是丑陋的方式。在所有东西周围都有 1 个表格。然后在操作中,您必须检查按下了哪个按钮(您在请求中获得了按钮的名称)。

由于 Firefox 和 ie 的差异,它变得更加丑陋。如果您按下了按钮,即 ie 或 firefox(不记得是哪一个),不仅会发送按下按钮的名称,还会发送按下按钮的位置。

如果您的解决方案可以依赖于支持 JS 的浏览器,那么您有更多选择。但那是另一个故事。

于 2010-02-15T22:40:37.020 回答