从一个控制器调用方法到另一个控制器时,Session为null ... MVC

时间:2015-07-13 16:13:41

标签: c# asp.net-mvc session

我有一个ASP.NET MVC应用程序,我添加了一个新的控制器,并从现有控制器调用这个新控制器的方法。我正在使用会话变量,在控制器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中它为空?谢谢

3 个答案:

答案 0 :(得分:14)

这是因为ControllerB需要初始化自己,并且作为此过程的一部分,它还会相应地设置SessionRequestResposne等。

因此,您需要调用Initialize方法并将其传递给当前RequestContext。但是,由于它被标记为protected(因为它不是直接调用,只使用ControllerFactory),所以您必须公开它:<\ n / p>

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的简写(RequestResponse等相同),因此您可以设置ControllerContext

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

请参阅MSDN

答案 1 :(得分:1)

这是因为Session是根据控制器的调用方式而初始化的属性。

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

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

答案 2 :(得分:1)

这很容易通过&#34;告诉,不要问&#34;的良好编码实践来解决,即你将所需的值传递给方法,而不是期望它为自己寻找它:

if (Session["Grid"] != null)
{
    var b  = new ControllerB ();
    b.CallMethod(Session["Grid"]);
}

...
public object CallMethod(string grid)
{
    //do your thing
}