【问题标题】:ASP.NET MVC 3 - Pass Session data to LayoutASP.NET MVC 3 - 将会话数据传递给布局
【发布时间】:2013-02-02 22:26:14
【问题描述】:

我想用布局(_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;
    }
}

【问题讨论】:

  • 我还没有找到会话对象没有被实例化的情况。我认为它在 Session_Start 上可用。请分享您的“父控制器类”

标签: asp.net-mvc session exception layout


【解决方案1】:

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

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

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

干杯

【讨论】:

  • 谢谢,您关于覆盖 OnActionExecuting 方法的建议正是我所需要的!
猜你喜欢
  • 2011-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-19
  • 2011-06-06
  • 2021-09-30
  • 2013-07-14
  • 2018-02-18
相关资源
最近更新 更多