为什么在程序实例化的控制器中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在这个动作中是可用的,所以我不认为这是相关的。

为什么在程序实例化的控制器中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字符串。