ASP.NET MVC 购物车数量更新并从购物车中删除商品

问题描述 投票:0回答:1

我是新人,所以请不要对我太苛刻。

我创建

Cart
并尝试更新视图内的项目数量,同时删除该项目。但没有任何作用。请大家帮帮我。

这些是我的视图模型、服务、控制器和视图:

public class CartItemViewModel
{
    public int Id { get; set; }
    public int ProductId { get; set; }
    public string ProductName { get; set; } = string.Empty;
    public string ProductImageUrl { get; set; } = string.Empty;

    [Required(ErrorMessage = RequireErrorMessage)]
    [Range(OrderItemQuantityMinValue,OrderItemQuantityMaxValue,
        ErrorMessage = QuantityErrorMessage)]
    public int Quantity { get; set; }
    public decimal ProductPrice { get; set; }
    public decimal TotalPrice { get; set; }
    public int CartId { get; set; } 
}
public class CartViewModel
{
    public int Id { get; set; }
    public string UserId { get; set; } = null!;
    public decimal GrandTotal { get; set; }
    public IEnumerable<CartItemViewModel> CartItems { get; set; } = new List<CartItemViewModel>();
}
public async Task<bool> RemoveCartItemFromCartAsync(int cartItemId)
{
     var cartItem = await context.CartsItems.FindAsync(cartItemId);

     if (cartItem != null)
     {
         context.CartsItems.Remove(cartItem);
         await context.SaveChangesAsync();
         return true;
     }

     return false;
}

public async Task<bool> UpdateCartItemQuantityAsync(int cartItemId, int newQuantity)
{
     var cartItem = await context.CartsItems.FindAsync(cartItemId);

     if (cartItem != null)
     {
         cartItem.Quantity = newQuantity;
         await context.SaveChangesAsync();
         return true;
     }

     return false;
}
[HttpPost]
public async Task<IActionResult> RemoveFromCart(int cartItemId)
{
    try
    {
        var result = await cartService.RemoveCartItemFromCartAsync(cartItemId);

        if (!result)
        {
            return NotFound();
        }
        
        return RedirectToAction(nameof(Cart));
    }
    catch (Exception)
    {
        return BadRequest();
    }
}

[HttpPost]
public async Task<IActionResult> UpdateCartItemQuantity(int cartItemId, int newQuantity)
{
    if (newQuantity <= 0)
    {
        return BadRequest("Invalid quantity.");
    }

    try
    {
        var result = await cartService.UpdateCartItemQuantityAsync(cartItemId, newQuantity);

        if (!result)
        {
            return NotFound();
        }

        return RedirectToAction(nameof(Cart));
    }
    catch (Exception )
    {
        return BadRequest();
    }
}
@model CartViewModel

<div class="row">
    <div class="col-12">
        <h1>Your Cart</h1>

        @if (Model.CartItems.Any())
        {
            <table class="table table-bordered">
                <thead>
                    <tr>
                        <th>Image</th>
                        <th>Name</th>
                        <th>Quantity</th>
                        <th>Price</th>
                        <th>Total</th>
                        <th>Action</th>
                    </tr>
                </thead>
                <tbody>
                    @foreach (var item in Model.CartItems)
                    {
                        <tr>
                            <td>
                                <img src="@item.ProductImageUrl" alt="Product Image" width="100px" height="100px" />
                            </td>
                            <td>@item.ProductName</td>
                            <td>
                                <form asp-controller="Cart" asp-action="UpdateCartItemQuantity" method="post">
                                    <input type="hidden" name="cartItemId" value="@item.Id" />
                                    <input type="number" name="newQuantity" value="@item.Quantity" min="1" />
                                    <button type="submit">Update</button>
                                </form>
                            </td>
                            <td>[email protected]</td>
                            <td>[email protected]</td>
                            <td>
                                <form asp-controller="Cart" asp-action="RemoveFromCart" method="post">
                                    <input type="hidden" name="cartItemId" value="@item.Id" />
                                    <button type="submit">Remove</button>
                                </form>
                            </td>
                        </tr>
                    }
                </tbody>
            </table>

            <div class="text-right">
                <h3>Total Amount</h3>
                <h3>Grand Total: [email protected]</h3>
                <a asp-action="Checkout" asp-controller="Order" class="btn btn-info">Proceed To Checkout</a>
            </div>
        }
        else
        {
            <p>Your cart is empty.</p>
        }
    </div>
</div>

我只是想让这件事发挥作用并继续下订单

c# asp.net-mvc asp.net-core
1个回答
0
投票

我创建购物车并尝试更新视图内的商品数量, 也可以删除该项目。但没有任何作用

嗯,根据您共享的代码,我已经调查了该问题并检查了详细信息。

我发现,您的代码似乎正确并且按预期工作。除了您尚未包含的 DbContext 代码之外,其他共享代码,我检查了是否按预期工作。

让我们考虑一下我最初在数据库中播种的以下示例数据。

我已经使用或更新并删除了控制器和服务代码及其相应的工作。

另外,我想建议你,你在点击 update 的时候检查过 update 方法是否已经被执行了吗?

控制器是否被击中?另请检查您的 get 方法是否相应地拉取更新的项目。因为一旦您更新了现有项目,您很快就应该提取最新或更新的值。

这是我尝试过的演示:

数据库上下文:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {

    }

    public DbSet<ApplicationUser> ApplicationUser { get; set; }
    public DbSet<CartItemViewModel> CartsItems { get; set; }

}

型号:

和你的一样

控制器:

为了从数据库中提取项目,我有以下内容:

public async Task<IActionResult>  Index()
{
    var cartItems = await _cartService.GetCartItemsAsync();

    return View(cartItems);
}

服务:

public async Task<CartViewModel> GetCartItemsAsync()
{
    

    var getCartIems = await _context.CartsItems.ToListAsync();
    if (getCartIems.Count == 0)
    {
        await AddCartItemsIntoTable();
        getCartIems = await _context.CartsItems.ToListAsync();
    }

    var myCart = new CartViewModel();
    myCart.Id = 1;
    myCart.UserId = "New User";
    myCart.GrandTotal = 1050;
    myCart.CartItems = getCartIems;

    return myCart;
}

查看:

与您的相同,删除、更新控制器也与您的相同。

输出:

注意:关于400,这是一个身份验证问题,请检查您的权限、令牌或userId是否有任何安全层。但除了 400 被认为是访问问题之外,其他代码你都写得正确。我建议您检查其他内容,例如数据库连接字符串、DbContext 配置或代码以外的任何其他内容。

© www.soinside.com 2019 - 2024. All rights reserved.