代码之家  ›  专栏  ›  技术社区  ›  Mark Kadlec

MVC2.0中的会话状态是如何工作的?

  •  2
  • Mark Kadlec  · 技术社区  · 14 年前

    我有一个存储各种信息的控制器(例如FormID、QuestionAnswerList等)。目前我把它们存储在Controller.Session中,工作正常。

    我想这很常见,你想在不同的控制器中共享某些“全局”变量,最佳实践是什么?

    以下是我的部分代码:

        public List<QuestionAnswer> QuestionAnswers
        {
            get
            {
                if (Session["QuestionAnswers"] == null)
                {
                    List<QuestionAnswer> qAnswers = qaRepository.GetQuestionAnswers(CurrentSection, UserSmartFormID);
                    Session["QuestionAnswers"] = qAnswers;
                    return qAnswers;
                }
                else
                {
                    return (List<QuestionAnswer>)Session["QuestionAnswers"];
                }
            }
            set
            {
                Session["QuestionAnswers"] = value;
            }
        }
    

    在我的第一个控制器(派生自BaseController)中:

    QuestionAnswers = qaRepository.GetQuestionAnswers(CurrentSection, UserSmartFormID);
    

    我逐步完成了代码,上面的语句执行得很好,设置了会话[“QuestionAnswers”],但是当我尝试从下面的另一个控制器获取时,会话[“QuestionAnswers”]为空!

    我的第二个控制器(也派生自BaseController):

    List<QuestionAnswer> currentList = (List<QuestionAnswer>)QuestionAnswers;
    

    上面这行不行!Session对象本身看起来是空的(不仅仅是Session[“QuestionAnswers”])

    4 回复  |  直到 14 年前
        1
  •  1
  •   Chase Florell    14 年前

    如果您使用

    HttpContext.Current.Session("mySpecialSession")  ''# note this is VB, not C#
    
        2
  •  1
  •   matto0    14 年前

    我相信TempData会解决您的问题,它在会话中与一起运行,并在多个请求之间保持,但是在默认情况下,一旦您再次访问它,它将清除存储的数据,如果这是一个问题,您可以告诉它使用新添加的keep()函数保留信息。

    所以在你的情况下: TempData[“问题答案”]=qAnswers;

    更多信息请访问: http://weblogs.asp.net/jacqueseloff/archive/2009/11/17/tempdata-improvements.aspx

        3
  •  1
  •   DancesWithBamboo    14 年前

    您在第二个控制器的何处访问会话?会话对象在构造函数中不可用,因为它在生命周期的稍后阶段被注入。

        4
  •  0
  •   Mark Kadlec    14 年前

    好吧,终于成功了,虽然有点混乱。我从另一个相关的SO帖子中找到了解决方案。

    我在BaseController中添加了以下内容:

            public new HttpContextBase HttpContext
        {
            get
            {
                HttpContextWrapper context =
                    new HttpContextWrapper(System.Web.HttpContext.Current);
                return (HttpContextBase)context;
            }
        }