Как обновить количество всех товаров в корзине с помощью одной кнопки обновления - PullRequest
0 голосов
/ 07 июня 2011

У меня есть следующий метод действия, когда я нажимаю кнопку обновления на своей корзине и отправляю сообщение этому методу, мне нужно, чтобы он связал все значения 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;

    }
}

}

Ответы [ 2 ]

0 голосов
/ 07 июня 2011

Ваш объект 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.
}
0 голосов
/ 07 июня 2011

Не будет ли проще иметь объект, скажем BasketItem, у которого productId и количество в качестве свойств?поэтому у вас будет один массив / список / ienumerable для передачи на обновление и связывание.

Ваша проблема устареет, поскольку связь между количеством и производством осуществляется через объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...