如何使用一个更新按钮更新购物车中所有商品的数量

时间:2011-06-07 10:54:17

标签: c# asp.net asp.net-mvc asp.net-mvc-2 c#-4.0

我有以下操作方法,当我按下购物车上的更新按钮并发布到此方法时,我需要将所有productId和partquantity值绑定到相应的参数/数组中(int [] ProductId,int [] partquantity)它就是这样做的。我假设当表单数据,即键和值被发布时,它们以某种顺序到达,可能是因为元素在HTML页面上排列(从上到下)?因此,我希望使用输入的正确零件数量来执行每个购物车项目的操作,即正确的productId。我猜他们是否按严格顺序发布和绑定,那么partquantity [2]应该是ProductId [2]等的正确数量?

对于ProductId []数组中每个productId上的每个操作尝试将f递增1的以下逻辑不起作用。我需要让这个工作,因为说我有5个项目添加到购物车并更改其中4个的数量我希望只需按一个更新按钮,它将更新购物车中的所有这些项目\行。因此,方法需要捕获所有已发布的productId和数量,并按正确的顺序使用,因此正确的数量将分配给由ProductId查找的右侧购物车项目。

public RedirectToRouteResult UpdateCart(Cart cart, int[] ProductId, int[] partquantity, string returnUrl)
{
   int f = 0;
   int x = partquantity.Length;

   while (f <= x) 
   {
     foreach (var pid in ProductId)
     {
       f++;
       var cartItem = cart.Lines.FirstOrDefault(c => c.Product.ProductID == pid);
       cartItem.Quantity = partquantity[f];
     }
   }
   return RedirectToAction("Index", new { returnUrl });
 }

这是视图:

<% foreach (var line in Model.Cart.Lines)
 { %>
  <tr>
    <td align="center"><%: Html.TextBox("partquantity", line.Quantity)%></td>
    <td align="left"><%: line.Product.Name%></td>
    <td align="right"><%: line.Product.ListPrice.ToString("c")%></td>
    <td align="right">
    <%: (line.Quantity * line.Product.ListPrice).ToString("c")%>
    </td>
  </tr>
<%: Html.Hidden("ProductId", line.Product.ProductID)%>
<% } %>

自定义活页夹

    public class CartModelBinder : IModelBinder
{

    private const string cartSessionKey = "_cart";

    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {

        if (bindingContext.Model != null)
            throw new InvalidOperationException("Cannot update instances");

        Cart cart = (Cart)controllerContext.HttpContext.Session[cartSessionKey];

        if (cart == null)
        {
            cart = new Cart();
            controllerContext.HttpContext.Session[cartSessionKey] = cart;

        }

        return cart;

    }
}

}

2 个答案:

答案 0 :(得分:0)

拥有一个Object会不会更容易 - 比如说具有productId且数量为属性的BasketItem?所以你将有一个数组/列表/ ienumerable传递更新和绑定。

由于数量和产量之间的关系是通过对象完成的,因此您的问题将会过时。

答案 1 :(得分:0)

你的购物车对象应该足够作为这个场景的参数,你可以有这样的东西。

一般的想法是使用一个索引,这样当你将它们传递给最初的视图时,你可以使用你的线获得你的Cart对象,但是有更新的数量值。

我理解你的模型:

public class Cart
{
  ...
  public List<CartItem> Lines {get; set; }
}

public class CartItem
{
  public Product Product {get; set;}
  public int Quantity {get; set;}
  ...
}

在您看来:

@model Cart
...
@using(Html.BeginForm())
{
  @{ int index = 0; }
  @foreach(var l in Model.Lines)
  {
    @Html.Hidden("cart.Lines.Index", index);
    @Html.Hidden("cart.Lines[" + index + "].Product.ProductID", l.Product.ProductID)
    @Html.TextBox("cart.Lines[" + index + "].Quantity")
    @{ index++; }
  }
  <input type="submit" value="Update Quantity" />
}

你的控制器:

public ActionResult UpdateCart(Cart cart)
{
  // you should have new values on Quantity properties of the cart.Lines items.
}