ASP.NET MVC 5:获取Session值存入数据表时遇错误求助
问题排查请求
我尝试从Session中获取值并添加到数据表,已编写CheckOut订单提交方法、Login会话存储方法及CustomerUser模型代码,但调试时触发空引用异常(Object reference not set to an instance of an object),请求协助排查。
相关代码
CheckOut订单提交方法
public ActionResult CheckOut(FormCollection form) { try { Cart cart = Session["Cart"] as Cart; OrderPro _order = new OrderPro();//订单表 _order.DateOrder = DateTime.Now; _order.AddressDeliverry = form["AddressDelivery"]; _order.IDCus = Convert.ToInt32(Session["ID"]); db.OrderProes.Add(_order); foreach (var item in cart.Items) { OrderDetail _order_detail = new OrderDetail(); _order_detail.IDOrder = _order.ID; _order_detail.IDProduct = item.product.ProductID; _order_detail.UnitPrice = (double)item.product.Price; _order_detail.Quantity = item.quantity; db.OrderDetails.Add(_order_detail); } db.SaveChanges(); cart.ClearCart(); return RedirectToAction("CheckOut_Success", "GioHang"); } catch { return Content("<script language='javascript' type='text/javascript'>alert('Đã xảy ra lỗi, vui lòng kiểm tra thông tin');</script>"); } }
Login会话存储方法
public ActionResult Login(CustomerUser cus) { var check = db.CustomerUsers.Where(s => s.NameUser == cus.NameUser && s.PasswordUser == cus.PasswordUser).FirstOrDefault(); if(check == null) { ViewBag.ErrorLogin = "Sai info đăng nhập"; return View("Index"); } else { db.Configuration.ValidateOnSaveEnabled = false; Session["NameUser"] = cus.NameUser; Session["PasswordUser"] = cus.PasswordUser; Session["ID"] = cus.ID; return RedirectToAction("DichVu", "Product"); } }
CustomerUser模型
public partial class CustomerUser { [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] public CustomerUser() { this.OrderProes = new HashSet<OrderPro>(); } public int ID { get; set; } public string NameUser { get; set; } public string PasswordUser { get; set; } public string PhoneUser { get; set; } public string EmailUser { get; set; } }
问题分析与修复方案
1. 核心错误:Login方法中Session["ID"]存储错误
登录时传入的cus参数仅包含用户名和密码,cus.ID是默认值(0或null),而非数据库中真实的用户ID。正确做法是存储查询到的check.ID:
// 替换Login方法中的Session赋值部分 Session["NameUser"] = check.NameUser; Session["ID"] = check.ID; // 不建议存储密码到Session,存在安全风险,可删除Session["PasswordUser"]
2. 空引用防护:CheckOut方法中增加非空判断
在使用Session和Cart前添加检查,避免空引用异常:
public ActionResult CheckOut(FormCollection form) { try { // 检查Cart是否存在且有商品 Cart cart = Session["Cart"] as Cart; if (cart == null || cart.Items == null || !cart.Items.Any()) { return Content("<script>alert('购物车为空');</script>"); } // 检查用户登录状态 if (Session["ID"] == null) { return Content("<script>alert('请先登录');</script>"); } int cusId = Convert.ToInt32(Session["ID"]); OrderPro _order = new OrderPro(); _order.DateOrder = DateTime.Now; _order.AddressDeliverry = form["AddressDelivery"]; _order.IDCus = cusId; db.OrderProes.Add(_order); db.SaveChanges(); // 先保存订单获取数据库生成的ID foreach (var item in cart.Items) { OrderDetail _order_detail = new OrderDetail(); _order_detail.IDOrder = _order.ID; // 此时_order.ID已有效 _order_detail.IDProduct = item.product.ProductID; _order_detail.UnitPrice = (double)item.product.Price; _order_detail.Quantity = item.quantity; db.OrderDetails.Add(_order_detail); } db.SaveChanges(); cart.ClearCart(); return RedirectToAction("CheckOut_Success", "GioHang"); } catch (Exception ex) { // 输出具体错误信息便于调试 return Content($"<script>alert('错误:{ex.Message}');</script>"); } }
3. 额外优化点
- 移除
Session["PasswordUser"]的赋值:将密码存入Session存在安全风险,无需存储。 - 拆分
SaveChanges()调用:先保存订单获取有效ID,再添加订单详情,避免IDOrder为默认值0。
内容的提问来源于stack exchange,提问作者Tiến Sử
相关产品推荐
相关产品推荐

