Asp.net mvc 2 会话状态在MVC2.0中是如何工作的?

Asp.net mvc 2 会话状态在MVC2.0中是如何工作的?,asp.net-mvc-2,session-state,Asp.net Mvc 2,Session State,我有一个控制器,可以存储各种信息(如FormID、问题回答列表等)。目前我将它们存储在控制器会话中,工作正常 我想将一些逻辑分解成一个单独的类(即RulesController),在这个类中我可以执行某些检查,等等,但是当我尝试在那里引用会话时,它是空的。很明显,会话只在特定控制器的上下文中有效,但是每个人都在做什么呢 我想这是很常见的,你想在不同的控制器中共享某些“全局”变量,什么是最佳实践 以下是我代码的一部分: 在我的BaseController类中: public List<

我有一个控制器,可以存储各种信息(如FormID、问题回答列表等)。目前我将它们存储在控制器会话中,工作正常

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

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

以下是我代码的一部分:

在我的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;
        }
    }
我仔细阅读了代码,上面的语句执行得很好,设置了会话[“QuestionAnswers”],但是当我试图从下面的另一个控制器获取时,会话[“QuestionAnswers”]为空

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

List currentList=(List)问题答案;

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

如果使用

HttpContext.Current.Session("mySpecialSession")  ''# note this is VB, not C#

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

因此,在你的情况下: ... TempData[“问题答案”]=qAnswers;

更多信息请访问:

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

好的,虽然有点麻烦,但最终还是让它工作了。我从另一个相关的SO帖子中找到了解决方案

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

QuestionAnswers = qaRepository.GetQuestionAnswers(CurrentSection, UserSmartFormID);
List<QuestionAnswer> currentList = (List<QuestionAnswer>)QuestionAnswers;
        public new HttpContextBase HttpContext
    {
        get
        {
            HttpContextWrapper context =
                new HttpContextWrapper(System.Web.HttpContext.Current);
            return (HttpContextBase)context;
        }
    }

然后使用HttpContext.Session设置/检索我的会话变量,工作正常

你能给我一些密码吗。我在整个网站上使用了会话状态,没有问题。我实际上在会话中存储了一个自定义类对象,并在会话中传递该类中的所有数据。(UserID、Username、UserRegion等)在这方面没有什么真正的改变。这里有一个类似的SO问题:您能展示一些设置和检索的代码吗?上面添加的代码,看起来会话对象本身为null并导致失败。MVC控制器中不存在这种情况,我看到的最接近的是HttpContext.CurrentHandler,但是我相信控制器会话对象是System.Web.HttpSessionBase,应该可以工作,不是吗?会话是从BaseController的属性访问的(第二个控制器也是从BaseController派生的)。是的,但是您是否尝试在第二个控制器的构造函数中使用QuestionAnswers属性?