У меня есть следующий сценарий в действии, где я хочу обновить количество всех предметов в данной тележке. Я отправляю массив в свой контроллер элементов моей корзины и хочу обновить количество, когда пользователь их обновил. Как я могу это достичь? Вот где я нахожусь.Эффективное обновление нескольких записей в коде
Это вид на мою телегу
@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();
}
Вам нужно обернуть элементы в форму и отправить форму методу POST (и удалить свою кнопку, которая создает GET и не отправит обратно вашу модель), посмотрите на атрибут 'href', который он генерирует, чтобы понять - и если бы это было сделано, это отправило бы исходные данные, а не отредактированные данные). Вам также понадобятся дополнительные скрытые входы для идентификации элемента в коллекции. –
Итак, мне нужно было бы обернуть их в тег формы и добавить скрытое поле для поля идентификатора для каждой позиции корзины правильно? – ddeamaral
Да. Любые свойства 'CartViewModel', включая свойства его коллекции' CartArray', которые вы хотите получить в контроллере, нуждаются в элементах управления формами внутри '@using (Html.BeginForm (...))' –