为什么在程序实例化的控制器中Session为空
本文关键字:Session 为空 控制器 程序 实例化 为什么 | 更新日期: 2023-09-27 18:06:42
在我的HomeController中,当一个特定的动作被调用时,我可以在调试时看到Session在那里。但是,当HomeController动作以编程方式实例化另一个控制器并访问其上的一个属性时,该属性会尝试访问会话,并且为空。
像这样:
public class HomeController : Controller
{
public PartialViewResult SomeAction()
{
// When debugging, I can break here and
// see the Session in the Immediate Window
var a = new AnotherController();
var b = a.SomeProperty;
}
}
public class AnotherController : Controller
{
public object SomeProperty
{
get
{
// Session is null here
return Session["MyProperty"];
}
}
}
编辑:不确定这是否重要,但忘记提及SomeAction是通过ajax调用的。因为Session在这个动作中是可用的,所以我不认为这是相关的。
public class HomeController : Controller
{
public PartialViewResult SomeAction()
{
// When debugging, I can break here and
// see the Session in the Immediate Window
var b = SessionHelper.SomeProperty;
}
}
public class SessionHelper
{
public static object SomeProperty
{
get
{
return System.Web.HttpContext.Current.Session["MyProperty"];
}
}
}
手工创建控制器不是一个好主意。您应该重构代码以避免这种情况。将属性移动到service并注入它。也许你需要创建自定义控制器工厂
如果您正在使用Session,您可能能够在任何地方获得它。你不需要实例化另一个控制器来读取它:
public class HomeController : Controller
{
public PartialViewResult SomeAction()
{
//you can access the session anywhere
var s = Session["MyProperty"] as YourTypeHere;
}
}
您还可以创建一个静态类来保存代表会话名称的const字符串。