我一直在遵循有关如何使用.net核心为网站添加购物车功能的教程,但是当我单击“添加到购物车”按钮时,它为我的操作方法提供了空值。 Add to cart returns a null value
这里应该是什么错误?
这是我的控制器类
namespace SanMarinoClassicWebsite.Controllers
{
public class ShoppingCartController : Controller
{
private readonly IPieRepository _pieRepository;
private readonly ShoppingCart _shoppingCart;
public ShoppingCartController(IPieRepository pieRepository, ShoppingCart shoppingCart)
{
_pieRepository = pieRepository;
_shoppingCart = shoppingCart;
}
public ViewResult Index()
{
var items = _shoppingCart.GetShoppingCartItems();
_shoppingCart.ShoppingCartItems = items;
var shoppingCartViewModel = new ShoppingCartViewModel
{
ShoppingCart = _shoppingCart,
ShoppingCartTotal = _shoppingCart.GetShoppingCartTotal()
};
return View(shoppingCartViewModel);
}
public RedirectToActionResult AddToShoppingCart(int pieId)
{
var selectedPie = _pieRepository.Pies.FirstOrDefault(p => p.PieId == pieId);
if (selectedPie != null)
{
_shoppingCart.AddToCart(selectedPie, 1);
}
return RedirectToAction("Index");
}
public RedirectToActionResult RemoveFromShoppingCart(int pieId)
{
var selectedPie = _pieRepository.Pies.FirstOrDefault(p => p.PieId == pieId);
if (selectedPie != null)
{
_shoppingCart.RemoveFromCart(selectedPie);
}
return RedirectToAction("Index");
}
}
}
购物车模型
namespace SanMarinoClassicWebsite.Models
{
public class ShoppingCart
{
private readonly AppDbContext _appDbContext;
private ShoppingCart(AppDbContext appDbContext)
{
_appDbContext = appDbContext;
}
public string ShoppingCartId { get; set; }
public List<ShoppingCartItem> ShoppingCartItems { get; set; }
public static ShoppingCart GetCart(IServiceProvider services)
{
ISession session = services.GetRequiredService<IHttpContextAccessor>()?
.HttpContext.Session;
var context = services.GetService<AppDbContext>();
string cartId = session.GetString("CartId") ?? Guid.NewGuid().ToString();
session.SetString("CartId", cartId);
return new ShoppingCart(context) { ShoppingCartId = cartId };
}
public void AddToCart(Pie pie, int amount)
{
var shoppingCartItem =
_appDbContext.ShoppingCartItems.SingleOrDefault(
s => s.Pie.PieId == pie.PieId && s.ShoppingCartId == ShoppingCartId);
if (shoppingCartItem == null)
{
shoppingCartItem = new ShoppingCartItem
{
ShoppingCartId = ShoppingCartId,
Pie = pie,
Amount = 1
};
_appDbContext.ShoppingCartItems.Add(shoppingCartItem);
}
else
{
shoppingCartItem.Amount++;
}
_appDbContext.SaveChanges();
}
public int RemoveFromCart(Pie pie)
{
var shoppingCartItem =
_appDbContext.ShoppingCartItems.SingleOrDefault(
s => s.Pie.PieId == pie.PieId && s.ShoppingCartId == ShoppingCartId);
var localAmount = 0;
if (shoppingCartItem != null)
{
if (shoppingCartItem.Amount > 1)
{
shoppingCartItem.Amount--;
localAmount = shoppingCartItem.Amount;
}
else
{
_appDbContext.ShoppingCartItems.Remove(shoppingCartItem);
}
}
_appDbContext.SaveChanges();
return localAmount;
}
public List<ShoppingCartItem> GetShoppingCartItems()
{
return ShoppingCartItems ??
(ShoppingCartItems =
_appDbContext.ShoppingCartItems.Where(c => c.ShoppingCartId == ShoppingCartId)
.Include(s => s.Pie)
.ToList());
}
public void ClearCart()
{
var cartItems = _appDbContext
.ShoppingCartItems
.Where(cart => cart.ShoppingCartId == ShoppingCartId);
_appDbContext.ShoppingCartItems.RemoveRange(cartItems);
_appDbContext.SaveChanges();
}
public decimal GetShoppingCartTotal()
{
var total = _appDbContext.ShoppingCartItems.Where(c => c.ShoppingCartId == ShoppingCartId)
.Select(c => c.Pie.Price * c.Amount).Sum();
return total;
}
}
}
Startup.cs 公共类创业 { 私人IConfigurationRoot _configurationRoot;
public Startup(IHostingEnvironment hostingEnvironment)
{
_configurationRoot = new ConfigurationBuilder()
.SetBasePath(hostingEnvironment.ContentRootPath)
.AddJsonFile("appsettings.json")
.Build();
}
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(_configurationRoot.GetConnectionString("DefaultConnection")));
services.AddTransient<ICategoryRepository, CategoryRepository>();
services.AddTransient<IPieRepository, PieRepository>();
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddScoped<ShoppingCart>(sp => ShoppingCart.GetCart(sp));
services.AddMvc();
services.AddMemoryCache();
services.AddSession();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseDeveloperExceptionPage();
app.UseStatusCodePages();
app.UseStaticFiles();
app.UseSession();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "categoryfilter",
template:"Pie/{action}/{category?}",
defaults: new {Controller ="Pie", action ="List"});
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
}
}
答案 0 :(得分:0)
我发现了我的错误,似乎我错误地使用了asp-route标签助手。我使用了asp-route-id而不是asp-route-pieId,
这些是片段
<a class="btn btn-primary" asp-controller="ShoppingCart" asp-action="AddToShoppingCart" asp-route-id="@Model.PieId">
<a class="btn btn-primary" asp-controller="ShoppingCart" asp-action="AddToShoppingCart" asp-route-pieId="@Model.PieId">