我想用布局(_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;
}
}
我还没有找到一种情况时,会话对象还没有被实例化。我认为它在Session_Start上可用。请分享你的'家长控制器班' –