我是新人,所以请不要对我太苛刻。
我创建
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>
我只是想让这件事发挥作用并继续下订单
我创建购物车并尝试更新视图内的商品数量, 也可以删除该项目。但没有任何作用
嗯,根据您共享的代码,我已经调查了该问题并检查了详细信息。
我发现,您的代码似乎正确并且按预期工作。除了您尚未包含的 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 配置或代码以外的任何其他内容。