2013-02-02 50 views
0

我想用布局(_Layout.cshtml)在每个页面上显示一些数据,所以我创建了一个父控制器类,并且在其构造函数中执行数据库访问。这种运作良好,除非我想达到的会话数据,因为当我尝试检查,如果会话变量存在,异常(NullReferenceException异常)的情况下被抛出:ASP.NET MVC 3 - 将会话数据传递给布局

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

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

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

更新: 戴夫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; 
    } 
} 
+0

我还没有找到一种情况时,会话对象还没有被实例化。我认为它在Session_Start上可用。请分享你的'家长控制器班' –

回答

1

你是在承担会话为空的理由是正确的。 ControllerBuilder在稍后的页面生命周期中注入会话HttpContext.Session。

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

一个警告的话,使用会话可能会阻碍通过标准单元控制器的可测性测试

干杯

+0

谢谢,你的建议重写OnActionExecuting方法正是我所需要的! – Csati

相关问题