У меня есть следующий метод действия, когда я нажимаю кнопку обновления на своей корзине и отправляю сообщение этому методу, мне нужно, чтобы он связал все значения productId и partquantity с соответствующими параметрами / массивами (int [] ProductId, int [] partquantity) и это делает это. Я предполагаю, что когда данные формы, то есть ключи и значения публикуются, они поступают в некотором порядке, вероятно, когда элементы размещены на странице HTML (сверху вниз)? Поэтому я хочу, чтобы операция с каждым элементом корзины выполнялась с использованием правильного введенного количества, то есть для правильного идентификатора продукта. Я предполагаю, что если они публикуют и связывают в строгом порядке, тогда partquantity [2] должен быть правильным количеством для ProductId [2] и т. Д.?
Приведенная ниже логика при попытке увеличить f на 1 для каждой операции над каждым productId в массиве ProductId [] не работает. Мне нужно, чтобы это работало, потому что, скажем, у меня есть 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)%>
<% } %>
Пользовательские Binder
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;
}
}
}