为什么我的会话变量在构建Controller时不可用?

时间:2009-09-15 00:28:22

标签: asp.net-mvc session

在尝试从构造函数中获取存储在Session [“objectName”]上的信息时使用ASP.NET MVC,我看到Session尚未设置,但是一旦构造了控制器,则Session包含正确的信息。

public class ABCController : Controller
{
   public ABCController() { var tmp = Session["Whatever"]; } //This line is null
   //But I know it has information

   public ActionResult Index() { var tmp = Session["Whatever"]; } //This works fine
}

由于

2 个答案:

答案 0 :(得分:13)

覆盖Controller基类的 Initialize 方法。请求上下文将传递给此方法。会话上下文是请求上下文的一部分。

    protected override void Initialize(System.Web.Routing.RequestContext requestContext)
    {
        base.Initialize(requestContext);
        var tmp = requestContext.HttpContext.Session["Whatever"];
    }

在创建控制器之后和调用action方法之前调用此方法。

答案 1 :(得分:8)

会话在HttpContext中找到。 HttpContext作为ControllerContext的一部分提供给控制器。由于ControllerContext不作为参数传递给构造函数,因此在创建类并分配了ControllerContext之后,它才可用。但是,它应该可用于控制器上的任何方法。在调用类构造函数之前,我不确定如何在之前填充类的属性(除非它们是静态类属性,但这不是这里的情况)。