C# 为什么编程实例化控制器中的会话为空?

C# 为什么编程实例化控制器中的会话为空?,c#,.net,session,model-view-controller,C#,.net,Session,Model View Controller,在我的HomeController中,当调用特定操作时,我可以在调试时看到会话在那里。但是,当HomeController操作以编程方式实例化另一个控制器并访问该控制器上的属性时,该属性尝试访问会话,并且该属性为null 大概是这样的: public class HomeController : Controller { public PartialViewResult SomeAction() { // When debugging, I can break h

在我的HomeController中,当调用特定操作时,我可以在调试时看到会话在那里。但是,当HomeController操作以编程方式实例化另一个控制器并访问该控制器上的属性时,该属性尝试访问会话,并且该属性为null

大概是这样的:

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调用的。由于会话在该操作中可用,我认为这与此无关。

手动创建控制器不是一个好主意。您应该重构代码以避免这种情况。将属性移动到服务并注入它。也许您需要创建自定义控制器。

手动创建控制器不是一个好主意。您应该重构代码以避免这种情况。将属性移动到服务并注入它。也许您需要创建自定义会话。

如果您使用的是会话,您可能可以在任何地方获得它。您不需要实例化另一个控制器来读取它:

public class HomeController : Controller
{
    public PartialViewResult SomeAction()
    {
        //you can access the session anywhere
        var s = Session["MyProperty"] as YourTypeHere;
    }
}

您还可以创建一个静态类来保存一个表示会话名称的常量字符串。

如果您正在使用会话,您可能可以在任何地方获取它。您不需要实例化另一个控制器来读取它:

public class HomeController : Controller
{
    public PartialViewResult SomeAction()
    {
        //you can access the session anywhere
        var s = Session["MyProperty"] as YourTypeHere;
    }
}
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"];
    }
  }
}

您还可以创建一个静态类来保存表示会话名称的const字符串。

因为ASP.NET MVC不仅仅是实例化一个控制器,它还通过上下文设置控制器实例,以便访问会话、请求等。@Igor那么您建议我做什么?使用该属性创建另一个类(非控制器)(可能是静态的)您使用的地方:
System.Web.HttpContext.Current.Session[“MyProperty”]
并在
SomeAction
中使用该类。您的想法完全错误。控制器永远不会在您自己的代码中使用
new AnotherController()创建
。控制器仅作为请求生命周期的一部分创建。因为ASP.NET MVC不仅仅是实例化一个控制器-它使用上下文设置控制器实例,以便访问会话、请求等@Igor那么您建议我怎么做?使用该属性创建另一个类(非控制器)(可能是静态的)您使用的位置:
System.Web.HttpContext.Current.Session[“MyProperty”]
并在
SomeAction
中使用该类。您的想法完全错误。使用
new AnotherController()在您自己的代码中永远不会创建控制器
。控制器仅作为请求生命周期的一部分创建。这对于此项目来说有点过分,但是对于链接来说+1…可能在将来派上用场。对于此项目来说有点过分,但是对于链接来说+1…可能在将来派上用场。
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"];
    }
  }
}