0

我想用布局(_Layout.cshtml)在每个页面上显示一些数据,所以我创建了一个父控制器类,数据库访问在其构造函数中执行。这很好用,除非我想访问会话数据,因为当我尝试检查会话变量是否存在时,会抛出异常(NullReferenceException):

if (Session["UserId"] != null)

System.NullReferenceException:对象引用未设置为对象的实例。

我认为这是因为父类中尚不存在 Session 对象。只有当我将代码复制到所有动作控制器时,我才能找到另一个将会话相关数据传递给布局的解决方案。有任何想法吗?

更新:Dave A,这里是父类:

public class PCMarketController : Controller
{
    protected PCMarketContext db = new PCMarketContext();

    public PCMarketController()
    {
        int numberOfCartItems = 0;
        if (Session["UserId"] != null) //Throws NullReferenceException in parent, works in action method
        {
            string UserId = HttpContext.Session["UserId"].ToString();
            List<CartItem> CartItems = db.CartItems.Where(i => i.UserId == UserId).ToList();
            foreach (var item in CartItems)
            {
                int count = item.Count;
                numberOfCartItems += count;
            }
        }
        ViewBag.NumberOfCartItems = " (" + numberOfCartItems + ")";
        List<Category> Categories = db.Categories.ToList();
        ViewBag.Categories = Categories;
    }
}
4

1 回答 1

1

您假设 Session 为空的原因是正确的。由ControllerBuilder在页面生命周期的稍后时间注入的会话HttpContext.Session。

对于这种情况,我通常会覆盖控制器的 OnActionExecuting 方法(http://msdn.microsoft.com/en-au/library/system.web.mvc.controller.onactionexecuting(v=vs.98).aspx)。

需要注意的是,使用会话可能会通过标准单元测试阻碍控制器的可测试性

干杯

于 2013-02-02T14:26:14.357 回答