You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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ử

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 18:31:06