【问题标题】:Session is null when calling method from one controller to another...MVC从一个控制器调用方法到另一个控制器时,会话为空...MVC
【发布时间】:2015-10-02 00:17:09
【问题描述】:

我有一个 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 中为空?谢谢

【问题讨论】:

    标签: c# asp.net-mvc session


    【解决方案1】:

    这是因为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

    【讨论】:

    • 你好 haim770 - 这就是我要找的。非常感谢
    • 你拯救了我的一天 :)
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-09-23
        • 2015-09-07
        • 1970-01-01
        • 1970-01-01
        • 2012-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多