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