代码之家  ›  专栏  ›  技术社区  ›  Geo

为什么我的会话变量在构造控制器时不可用?

  •  3
  • Geo  · 技术社区  · 15 年前

    使用ASP.NET MVC尝试从构造函数获取存储在会话[“objectname”]上的信息时,我发现会话尚未设置,但一旦构造了控制器,则会话将包含正确的信息。

    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 回复  |  直到 15 年前
        1
  •  8
  •   tvanfosson    15 年前

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

        2
  •  13
  •   Christian13467    15 年前

    覆盖 初始化 控制器类的方法。将请求上下文传递给此方法。会话上下文是请求上下文的一部分。

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

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