Uwakpeter Ответов: 2

Как перебирать таблицу и обновлять отдельные записи в MVC 5 без перенаправления


Привет Дом,

Я работаю над проектами MVC 5, у меня есть таблица корзины покупок в моих представлениях, и в таблице есть текстовое поле для количества, где пользователи могут изменить количество на любом продукте. У меня есть кнопка в нижней части страницы, на которую я хочу, чтобы пользователи нажимали и обновляли свое недавно введенное количество. ниже приведен мой код:

<table class="table">
                        <thead>
                            <tr>
                                <th colspan="2">Product</th>
                                <th>Quantity</th>
                                <th>Unit price</th>
                                <th>Discount</th>
                                <th colspan="2">Total</th>
                            </tr>
                        </thead>
                        <tbody>
                        @foreach (var Item in Model)
                          {                              
                            <tr>
                                <td>                                       
                                   <img src="@Item.FrontViewThumbNail" alt="@Item.ProductName">                                       
                                </td>
                                <td>
                                   @Item.ProductSku.ToUpper()- @Item.ProductName
                                </td>
                                <td>
                                    <input type="number" value="@Item.ProductQuantity" class="form-control" min="1" id="quantity" name="quantity">                                        
                                    <input type="hidden" value="@Item.ProductID" name="hiddens" />                                  
                                </td>
                                <td> ₦@Item.ProductPrice.ToString("N2", System.Globalization.CultureInfo.InvariantCulture)</td>
                                <td> ₦@ViewBag.Discount</td>
                                <td> ₦@Item.ProductTotalPrice.ToString("N2", System.Globalization.CultureInfo.InvariantCulture)</td>
                                <td>
                                    @*<a href="#"></a>*@
                                    <a href="@Url.Action("ViewCart", "Home", new { id = Item.ProductID })" class="btn btn-xs btn-bricky tooltips" data-placement="top" data-original-title="Delete"></a>
                                </td>
                            </tr>

                            }
                        <tfoot>
                            <tr>
                                <th colspan="5">Total</th>
                                <th colspan="2">₦@ViewBag.CartTotal.ToString("N2", System.Globalization.CultureInfo.InvariantCulture)</th>
                            </tr>
                        </tfoot>


                    </table>

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

Что я уже пробовал:

метод post:
[HttpPost]
    public ActionResult ViewCart(IEnumerable<string> quantity, string command,IEnumerable<string> hiddens)
    {

        if (command == "UpdateCart")
        {
            var getRecordForUpdate = (from u in db.ShoppingCarts.Where(x => x.CartSessionID == Request.AnonymousID) select u).ToList();
            if(getRecordForUpdate !=null)
            {
                foreach (var quan in quantity)
                {
                    get
                }
            }              
        }
}

Karthik_Mahalingam

использовать на jQuery.Аякс() [^]

Uwakpeter

Я не знаю Jquery, я буду признателен, если вы окажете мне дальнейшую помощь.

2 Ответов

Рейтинг:
2

njammy

См. мое решение ниже:

Контроллер / Модели

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace CartSample.Controllers
{
    public class CartController : Controller
    {
        [HttpGet]
        public ActionResult Index()
        {
            var model = new Order
            {
                Products = new List<Product>
                {
                    new Product
                    {
                        Name = "item 1",
                        Qty = 2,
                        Price = 9.99m
                    }
                }
            };
            return View(model);
        }

        [HttpPost]
        public ActionResult Index(Order model)
        {
            // Do something with udpated quantities
            foreach(var product in model.Products)
            {
                UpdateProductQty(product);
            }
            return View(model);
        }

        private void UpdateProductQty(Product product)
        {
            // Do something more useful than this example...
            var updatedQuantity = product.Qty;
        }
    }
    public class Order
    {
        public List<Product> Products { get; set; }
        public Order()
        {
            Products = new List<Product>();
        }
    }

    public class Product
    {
        public string Name { get; set; }
        public int Qty { get; set; }
        public decimal Price { get; set; }
        public decimal Total()
        {
            return Price * Qty;
        }
    }
}


Смотреть

Примечание: как я использовал Html. hiddenFor для обеспечения того, чтобы встроенный механизм MVC сопоставлял поля формы для существующих элементов корзины с параметром модели для действия Index (post) в контроллере.
Таким образом, вы можете легко заглянуть в модель, представленную в action post, и сделать то, что вы хотите, с обновленным кол-во Для каждого элемента.

@model CartSample.Controllers.Order
<html>
<head><title>Cart Sample</title>
</head>

<body>
    @using (Html.BeginForm("Index", "Cart", FormMethod.Post))
    {
        <table>
            <tr>
                <th>Name</th>
                <th>Qty</th>
                <th>Price</th>
                <th>Total</th>
            </tr>
            @for (int i = 0; i < Model.Products.Count; i++)

            {

                <tr>
                    <td>@Html.HiddenFor(x=>x.Products[i].Name)
                        @Html.DisplayFor(x=>x.Products[i].Name)</td>
                    <td>@Html.TextBoxFor(x=>x.Products[i].Qty)</td>
                    <td>@Html.HiddenFor(x => x.Products[i].Price)
                        @Html.DisplayFor(x => x.Products[i].Price)</td>
                    <td>@Model.Products[i].Total()</td>
                </tr>
            }
            <tr>
                <td>
                    <input type="submit" value="update" />
                </td>
            </tr>
        </table>
    }
</body>
</html>


Это приводит к появлению следующих экранов
https://s9.postimg.org/puc32qwdr/Cart.png[^]


Uwakpeter

будет ли это все еще работать, если у вас есть более одного товара в корзине?

njammy

Он абсолютно работает со многими предметами.
Кстати, это будет работать и асинхронно, если вы замените мой код "beginForm" на Ajax-форму.

Рейтинг:
1

MSagar007

Измените действие вашего контроллера там, где вы хотите выполнить подобное действие

[HttpPost]
    public ActionResult ViewCart(int Id)
    {
       var getRecordForUpdate = (from u in db.ShoppingCarts.Where(x =>x.CartSessionID == Id) select u).FirstOrDefault();
            if(getRecordForUpdate !=null)
            {
                //do your stuff here
            }              
        }
}


Это поможет вам выполнить действие для одного выбранного значения или модели, независимо от того, что вы связываете.