c#:如何从视图中检索会话作为对象.净MVC吗?



我创建了一个名为CartItem的会话,当用户选择产品时,它存储产品。

我的问题是我想通过使用反序列化来检索会话CartItem作为对象,但编译器说它具有空值。

这是我的CartItem模型类:

public class CartItem
{
public int ProductId { get; set; }
public string ProductName { get; set; }
public int Quantity { get; set; }
public float Price { get; set; }
public float Total
{
get { return Quantity * Price; }
}
public string Image { get; set; }
public CartItem()
{
}
public CartItem(Product product)
{
ProductId = product.ID;
ProductName = product.Name;
Price = product.Price;
Quantity = 1;
}
}
下面是我创建会话 的方法
public static class SessionExtensions
{
//convert from object to binary
public static void SetJson(this ISession session, string key, object value)
{
// Set the given key and value in the current session. 
session.SetString(key, JsonConvert.SerializeObject(value));
}
// convert from binary to object
public static T GetJson<T>(this ISession session, string key)
{
var sessionData = session.GetString(key);
//null return default
return sessionData == null ? default : JsonConvert.DeserializeObject<T>(sessionData);
}
}

这是我的CartController:

public class CartController : Controller
{
private readonly AppDbContext _context;
string baseURL = "https://localhost:7177/";
private ServiceConnection connectToAPI;
public CartController(AppDbContext context)
{
_context = context;
connectToAPI = new ServiceConnection();
}
public IActionResult Index()
{
// if.getJson is null then create new List CartItem object
List<CartItem> cart = HttpContext.Session.GetJson<List<CartItem>>("Cart") ?? new List<CartItem>();
CartViewModel cartVM = new()
{
CartItems = cart,
//LINQ iterate and sum all the items in cart
GrandTotal = cart.Sum(x => x.Quantity * x.Price)
};
return View(cartVM);
}
public async Task<IActionResult> Add(int id)
{
// Consume API
Product product = new Product();

connectToAPI.UseUrl += "api/products/" + id;
// Check response
HttpResponseMessage getData = await connectToAPI.CallServiceGet();
if (getData.IsSuccessStatusCode)
{
string results = getData.Content.ReadAsStringAsync().Result;
// convert data from SQL to Product object and will be used 
product = JsonConvert.DeserializeObject<Product>(results);
}
else
{
Console.WriteLine("Error");
}
// Product product = await _context.Product.FindAsync(id);
// WANT THIS LIST CARTiTEM iN   IN ORDERLINE
List<CartItem> cart = HttpContext.Session.GetJson<List<CartItem>>("Cart") ?? new List<CartItem>();
CartItem cartItem = cart.Where(c => c.ProductId == id).FirstOrDefault();
if (cartItem == null)
{  
cart.Add(new CartItem(product));
}
else
{
cartItem.Quantity += 1;
}
HttpContext.Session.SetJson("Cart", cart);
TempData["Success"] = "The product has been added!";
//same as return RedirectToAction("index","Products");
return Redirect(Request.Headers["Referer"].ToString());
}
}

这是视图

@model CartViewModel
@{
ViewData["Title"] = "Cart Overview";
}
@if (Model.CartItems.Count > 0)
{
<table class="table">
<tr>
<th>Product</th>
<th>Quantity</th>
<th></th>
<th>Price</th>
<th>Sub Total</th>
</tr>
@foreach (var item in Model.CartItems)
{
<tr>
<td>@item.ProductName</td>
<td>@item.Quantity</td>
<td>
<a class="btn btn-primary btn-sm" asp-action="Add" asp-route-id="@item.ProductId">+</a>
<a class="btn btn-info btn-sm" asp-action="Decrease" asp-route-id="@item.ProductId">-</a>
<a class="btn btn-danger btn-sm" asp-action="Remove" asp-route-id="@item.ProductId">Remove</a>
</td>
<td>@item.Price kr.</td>
<td>@Model.CartItems.Where(x => x.ProductId == item.ProductId).Sum(x => x.Quantity * x.Price) kr.</td>
</tr>
}
<tr>
<td class="text-right" colspan="4"> Total: @Model.GrandTotal kr.</td>
</tr>
<tr>
<td class="text-right" colspan="4">
<a class="btn btn-danger" asp-action="Clear">Clear Cart</a>
<a class="btn btn-primary" asp-controller="Orders" asp-action="Create" asp-route-CartItem="@Model.CartItems">Checkout</a>
</td>
</tr>
</table>
}
else
{
<h3 class="display-4 text-center">Your cart is empty.</h3>
}

我不确定我做的是否正确,我使用

asp-route-CartItem="@Model.CartItems" 

当用户按checkout到OrdersController中的Create方法时,传递CartItems

<a class="btn btn-primary" asp-controller="Orders" asp-action="Create" asp-route-CartItem="@Model.CartItems">Checkout</a>

这里是OrderController这里有一个方法Create我想将会话CartItem转换为对象这样我就可以获得cartItem.productIdcartItem.Price这样的值但是它不起作用

public class OrdersController : Controller
{
CustomerServiceConnection cusService = new CustomerServiceConnection();
OrderServiceConnection orderService = new OrderServiceConnection();
CustomerDatabaseAccessa _customerAccess;
public OrdersController(IConfiguration inConfiguration)
{
_customerAccess = new CustomerDatabaseAccessa(inConfiguration);
}
public IActionResult Index()
{
return View();
}
// GET: ShapesController/Create
public ActionResult Create()
{
return View();
}
// POST: Customers/Create
[HttpPost]
public async Task<ActionResult> Create(Customer customer, Order order, CartItem cartItem )
{
DateTime insertedDateTime = DateTime.Now;
int customerId = await cusService.SaveCustomer(customer);
order = new(customerId, insertedDateTime);
int orderId = await orderService.SaveOrder(order);
HttpContext.Session.SetJson("Cart", cartItem);

CartItem item = HttpContext.Session.GetJson<CartItem>("Cart");
// the value here are 0 I'm not sure why
OrderLine orderline = new OrderLine(item.ProductId, 90, item.Quantity, item.Total);
_customerAccess.CreateOrderLine(orderline);
return RedirectToAction(nameof(Index));
// OrderLine orderline = new OrderLine(1, 66, 2, 10);
// Customer da = new("Adam", "Star", "4564566", "123@gmaill.com");
//  int cusId = _customerAccess.CreateCustomera(da);
//  Order ad = new(returnCustomerId, insertedDateTime);
//int orderId = _customerAccess.CreateOrder(ad);
// int OrderLine = _customerAccess.CreateOrderLine(orderId, cusId, etc);
//  Order orderOBJ = new(cus.Id, order.orderDate); */
}
}
}

我怀疑asp-route-CartItem无效。您最好将其转换为JSON并作为字符串传递。你得到null值是因为你设置了null值——没有CartItem被传递给你的动作方法。

使用此链接:

<a class="btn btn-primary" href="/Orders/Create?cartItem=@(JsonConvert.SerializeObject(Model.CartItems))">Checkout</a>

使参数cartItem的类型为string,并在方法中对其进行反序列化:

var cartItemObj = JsonConvert.DeserializeObject<CartItem>(cartItem);

最新更新