我是新来的,请不要对我太苛刻了.

我创建了Cart,并try 更新视图中的项目数量,同时删除项目.但都没什么用.请帮帮我,伙计们.

以下是我的视图模型、服务、控制器和视图:

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>$@item.ProductPrice</td>
                            <td>$@item.TotalPrice</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: $@Model.GrandTotal</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>

我只想让这件事正常工作,然后继续下订单

推荐答案

我创建购物车,并try 更新视图中的项目数量, 也是为了移除物品.可是都没效

好吧,根据你的共享代码,我已经调查了这个问题并判断了细节.

我发现,你的代码似乎正确,并按预期工作.除此之外,你没有被包括在内的dbContext代码,其他共享代码,我判断了正常工作.

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

enter image description here

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

另外,我想建议你,你有没有判断过更新方法是否已经执行,而你正在点击更新?

控制器会被击中吗?还要判断你的get方法是否相应地拉取更新的项目.因为一旦你更新了现有的项目,你很快就会拉取最新的或更新的值.

以下是我try 过的Demo:

dbContext:

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

    }

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

}

注:在粘贴箱我判断了你的OnModelCreating(ModelBuilder builder)配置,我不知道什么是你的CartItem配置,我还没有使用,仍然相应地工作.如果你完全不确定为什么你定义了这些,你可以 comments ,暂时和测试,我认为这是问题.

型号:

和你的一样

控制器:

为了从数据库中提取项目,我有如下所示:

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;
}

观点:

与您的相同,删除,更新控制器与您的相同.

输出:

enter image description here

enter image description here

Note:关于,400它是一个身份验证问题,如果有任何安全层,请判断您的权限,令牌或userId.但是除了400这被认为是访问问题,其他代码你写的正确.我建议您判断其他东西,如数据库连接字符串,dbContext配置或任何其他代码以外的东西.

Csharp相关问答推荐

使用GeneratedComInterfaceProperty的.NET 8 COM类对于VB 6/SYS或ALEViewer不可见

获取ASP.NET核心身份认证cookie名称

不带身份的Blazor服务器.Net 8 Cookie身份验证

如何捕获对ASP.NET核心应用程序的所有请求并将其发送到一个页面

C# CompareTo()和Compare()可以返回除-1和1以外的整数吗?

如何在VS代码中为C#DotNet配置.json选项以调试内部终端的控制台应用程序

用于管理System.Text.Json中的多态反序列化的自定义TypeInfoResolver

交替的奇数

链接到字典字符串.拆分为(.Key,.Value)

WinUI 3中DoubleCollection崩溃应用程序类型的依赖属性

如何在GRPC代码First服务的返回类型上使用多态性?

为什么我的伺服电机不动,下面的代码?

使用动态键从请求体反序列化JSON

{ or ; expected error如何解决此问题

我的命名管道在第一次连接后工作正常,但后来我得到了System.ObjectDisposedException:无法访问关闭的管道

毛伊岛.NET 8图片不再适合按钮

当我手动停止和关闭系统并打开时,Windows服务未启动

SharpZipLib在文件名前加上目录名,生成tar.gz

.NET8支持Vector512,但为什么向量不能达到512位?

如何对构建在Clean架构和CQRS之上的控制器进行单元测试?