我使用一个带有发布功能的提交按钮,使用模型(Cart.cs(将数量和产品发送到列表项。我如何将数据(注入(到控制器中,以便使用所有订单的总数量添加到ViewBag中,以便在网站的不同部分显示?
using System.Collections.Generic;
using System.Linq;
namespace MyStore.Models
{
public class Cart
{
public List<CartLine> Lines { get; set; } = new List<CartLine>();
public virtual void AddItem(Product product, int quantity)
{
CartLine line = Lines
.Where(p => p.Product.ProductID == product.ProductID)
.FirstOrDefault();
if (line == null)
{
Lines.Add(new CartLine
{
Product = product,
Quantity = quantity
});
}
else
{
line.Quantity += quantity;
}
}
public virtual void RemoveLine(Product product) =>
Lines.RemoveAll(l => l.Product.ProductID == product.ProductID);
public decimal ComputeTotalValue() =>
Lines.Sum(e => e.Product.Price * e.Quantity);
public virtual void Clear() => Lines.Clear();
}
public class CartLine
{
public int CartLineID { get; set; }
public Product Product { get; set; }
public int Quantity { get; set; }
}
}
我认为您可以尝试使用session,这样您就可以在不同的操作中保留列表。检查会话是否为null或不在您的操作中。如果session不为null,请使用session设置Lines。在将数据添加到行之后,用更新的行设置会话
配置:
public void ConfigureServices(IServiceCollection services)
{
...
services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromDays(1);
options.Cookie.HttpOnly = true;
options.Cookie.IsEssential = true;
});
}
控制器:
public List<CartLine> Lines { get; set; } = new List<CartLine>();
public virtual void AddItem(Product product, int quantity)
{
if (string.IsNullOrEmpty(HttpContext.Session.GetString("Lines")))
{
Lines=JsonConvert.DeserializeObject<List<CartLine>>(HttpContext.Session.GetString("Lines"));
}
CartLine line = Lines
.Where(p => p.Product.ProductID == product.ProductID)
.FirstOrDefault();
if (line == null)
{
Lines.Add(new CartLine
{
Product = product,
Quantity = quantity
});
}
else
{
line.Quantity += quantity;
}
HttpContext.Session.SetString("Lines", JsonConvert.SerializeObject(Lines));
}
public virtual void RemoveLine(Product product){
if (string.IsNullOrEmpty(HttpContext.Session.GetString("Lines")))
{
Lines=JsonConvert.DeserializeObject<List<CartLine>>(HttpContext.Session.GetString("Lines"));
}
Lines.RemoveAll(l => l.Product.ProductID == product.ProductID);
HttpContext.Session.SetString("Lines", JsonConvert.SerializeObject(Lines));
}
public decimal ComputeTotalValue(){
if (string.IsNullOrEmpty(HttpContext.Session.GetString("Lines")))
{
Lines=JsonConvert.DeserializeObject<List<CartLine>>(HttpContext.Session.GetString("Lines"));
}
Lines.Sum(e => e.Product.Price * e.Quantity);
}