我有一个存储各种信息的控制器(即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”])
答案 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变量并且工作正常!