会话状态如何在MVC 2.0中运行?

时间:2010-07-29 00:19:42

标签: asp.net-mvc-2 session-state

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

我想将一些逻辑划分为一个单独的类(即RuleController),我可以执行某些检查等,但是当我尝试在那里引用Session时,它是null。很明显,Session只在特定控制器的上下文中保持有效,但每个人都在做什么呢?

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

以下是我的代码的一部分:

在我的BaseController类中:

    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;
        }
    }

在我的第一个Controller(派生自BaseController)中:

QuestionAnswers = qaRepository.GetQuestionAnswers(CurrentSection, UserSmartFormID);

我逐步执行代码并且上面的语句执行正常,设置了Session [“QuestionAnswers”],但是当我尝试从下面的另一个控制器获取时,Session [“QuestionAnswers”]为空!

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

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

上述行失败了!看起来Session对象本身是null(不仅仅是Session [“QuestionAnswers”])

4 个答案:

答案 0 :(得分:1)

如果您使用

检索会话,会有所不同吗?
HttpContext.Current.Session("mySpecialSession")  ''# note this is VB, not C#

答案 1 :(得分:1)

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

所以在你的情况下: ...     TempData [“QuestionAnswers”] = qAnswers; ...

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

好的,终于有了它的工作,虽然有点kludgy。我从另一个相关的SO帖子中找到了解决方案。

我将以下内容添加到我的BaseController中:

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

然后使用HttpContext.Session设置/检索我的Session变量并且工作正常!