2

У меня есть следующий сценарий в действии, где я хочу обновить количество всех предметов в данной тележке. Я отправляю массив в свой контроллер элементов моей корзины и хочу обновить количество, когда пользователь их обновил. Как я могу это достичь? Вот где я нахожусь.Эффективное обновление нескольких записей в коде

Это вид на мою телегу

@model SeniorProjectMVC.Models.ViewModels.CartViewModel 

@{ 
    ViewBag.Title = "Index"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h3>Your cart</h3> 

@*<p> 
    @Html.ActionLink("Create New", "Create") 
</p>*@ 

<div class="row header-row"> 
    <div class="large-1 columns"> 
     <h4> Quantity</h4> 
    </div> 
    <div class="large-5 columns text-center"> 
     <h4>Name</h4> 
    </div> 
    <div class="large-1 columns"> 
     <h4>Price</h4> 
    </div> 
    <div class="large-2 columns"> 
     <h4>In stock</h4> 
    </div> 
    <div class="large-3 columns"></div> 
</div> 
@{ 
    int CurrentIndex = 1; 
} 
@for (int i = 0; i < Model.CartArray.Length; i++) 
{ 

    <div class="@(CurrentIndex % 2 == 0 ? "row primary-row" : "row alternate-row")"> 
     <div class="large-1 columns"> 
      @Html.EditorFor(m => m.CartArray[i].Quantity) 
     </div> 
     <div class="large-5 columns text-center"> 
      @Html.DisplayFor(m => m.CartArray[i].Sku.Product.Name) 
     </div> 
     <div class="large-1 columns"> 
      @*@Html.DisplayFor(m => m.CartArray[i].Sku.Product.Price)*@ 
      @String.Format("{0:c}", (Model.CartArray[i].Sku.Product.Price * Model.CartArray[i].Quantity)) 
     </div> 
     <div class="large-2 columns"> 
      @(Model.CartArray[i].Sku.Quantity > 0 ? "In Stock" : "Out of stock") 
     </div> 
     <div class="large-3 columns"> 
      <ul class="button-group"> 
       @*<li class="button">@Html.ActionLink("Edit", "Edit", new { id = Model.CartArray[i].ID }, new { @class = "button primary" }) </li>*@ 
       <li class="button">@Html.ActionLink("Remove", "Remove", new { id = Model.CartArray[i].ID }, new { @class = "button primary" })</li> 
      </ul> 

      @*@Html.ActionLink("Details", "Details", new { id = item.ID }, new { @class = "button primary" }) |*@ 

     </div> 
    </div> 
    { CurrentIndex = CurrentIndex + 1; } 
} 
<div clsas="row"> 
    <div class="large-offset-8 columns"> 
     <h5 class="inline">Subtotal:</h5><h4 class="inline">@(Model.CartArray.Sum(p => (p.Sku.Product.Price * p.Quantity)).ToString("c"))</h4> 
    </div> 
</div> 

<div class="row"> 
    <div class="medium-offset-8 medium-4 columns"> 
     <ul class="button-group"> 
      <li class="button">@Html.ActionLink("Update Quantities", "UpdateQuantities", "Cart", new { array = Model.CartArray }, new { @class = "button primary large" })</li> 
      @if (Request.IsAuthenticated && User.Identity.IsAuthenticated) 
      { 
       <li class="button">@Html.ActionLink("Checkout", "Address", "Checkout", null, new { @class = "button primary large" })</li> 
      } 
      else 
      { 
       <li class="button secondary">You must sign in to checkout</li> 
      } 

     </ul> 
    </div> 
</div> 

Это действие, которое я хочу отправить количество обратно в контроллер, а затем обновить свой контекст базы данных класса. Я не знаю, как и как наиболее эффективный способ добиться этого.

public ActionResult UpdateQuantities(Models.ViewModels.CartViewModel cartModel) 
     { 
      for (int i = 0; i < cartModel.CartArray.Length; i++) 
      { 
       //either update each record, or build a list to do one mass update. 
       //This is where I am stuck 
      } 

      return View(); 
     } 
+1

Вам нужно обернуть элементы в форму и отправить форму методу POST (и удалить свою кнопку, которая создает GET и не отправит обратно вашу модель), посмотрите на атрибут 'href', который он генерирует, чтобы понять - и если бы это было сделано, это отправило бы исходные данные, а не отредактированные данные). Вам также понадобятся дополнительные скрытые входы для идентификации элемента в коллекции. –

+0

Итак, мне нужно было бы обернуть их в тег формы и добавить скрытое поле для поля идентификатора для каждой позиции корзины правильно? – ddeamaral

+1

Да. Любые свойства 'CartViewModel', включая свойства его коллекции' CartArray', которые вы хотите получить в контроллере, нуждаются в элементах управления формами внутри '@using (Html.BeginForm (...))' –

ответ

0

Вы должны быть в состоянии пойти с чем-то вроде этого:

public ActionResult UpdateQuantities(Models.ViewModels.CartViewModel cartModel) 
{ 
    // instantiate your database context if it's not already done 
    using (var db = new Context()) 
    { 
     for (int i = 0; i < cartModel.CartArray.Length; i++) 
     { 
      // update your records one at a time 
      db.YourItems.Where(i => <your_criteria>).Member = NewValue; 
     } 

     // commit your changes only once at the end 
     db.SaveChanges(); 

     return View(); 
    } 

В зависимости от того, как структурированы ваши данные модели, вы можете также заменить цикл выше что-то вроде этого:

var items = db.YourItems.ToList(); 
items.ForEach(i => i.Member = cartModel.CartArray[i.Id].NewValue); 

или если вам необходимо обновить несколько свойств:

items.ForEach(i => { 
    i.Member1 = cartModel.CartArray[i.Id].Value1; 
    i.Member2 = cartModel.CartArray[i.Id].Value2; 
}; 
Смежные вопросы