我有以下操作方法,当我按下购物车上的更新按钮并发布到此方法时,我需要将所有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;
}
}
}
答案 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.
}