当从一个控制器到另一个控制器调用方法时,Session是空的

本文关键字:控制器 方法 Session 调用 一个 另一个 | 更新日期: 2023-09-27 18:02:39

我有一个ASP。我给它添加了一个新控制器,并从这个新控制器从一个现有的控制器调用一个方法。我使用会话变量,在控制器A中,我调用控制器B中的方法:

if (Session["Grid"] != null){}//session object is fine here
      ControllerB b  = new ControllerB ();
b.CallMethod();

在我称为B的新控制器中,方法是这样的:

public object CallMethod(){
    if (Session["Grid"] != null)//session object is null
        {
            //do my thing
        }
  }

问题不在会话变量,而在会话对象。它完全为空,因此我的应用程序崩溃了。会话在控制器A中是有效的,那么为什么它在控制器B中是空的呢?谢谢你

当从一个控制器到另一个控制器调用方法时,Session是空的

这是因为ControllerB需要初始化自己,并且作为此过程的一部分,它也相应地设置了Session, Request, Resposne等。

因此,您需要调用Initialize()方法并将当前RequestContext传递给它。但是,由于它被标记为protected(因为它不打算直接调用,只使用ControllerFactory),您必须公开它:

public class ControllerB : Controller
{
    public void InitializeController(RequestContext context)
    {
        base.Initialize(context);
    }
}

然后在你的ControllerA:

var controllerB = new ControllerB();
controllerB.InitializeController(this.Request.RequestContext);

或者,由于Session getter实际上是this.ControllerContext.HttpContext.Session的简写(Request, Response等也是如此),您可以设置ControllerContext:

var controllerB = new ControllerB();
controllerB.ControllerContext = new ControllerContext(this.Request.RequestContext, controllerB);

查看MSDN

之所以会发生这种情况,是因为Session是一个属性,根据控制器的调用方式进行初始化。

可以用HttpContext.Session代替SessionHttpContext指当前http请求。

public object CallMethod(){
    if (HttpContext.Session["Grid"] != null)//session object is null
    {
        //do my thing
    }
}

这很容易通过"告诉,不要问"的良好编码实践来修复,即您将所需的值传递给方法,而不是期望它自己去寻找它:

if (Session["Grid"] != null)
{
    var b  = new ControllerB ();
    b.CallMethod(Session["Grid"]);
}
...
public object CallMethod(string grid)
{
    //do your thing
}