我有一个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中它为空?谢谢
答案 0 :(得分:14)
这是因为ControllerB
需要初始化自己,并且作为此过程的一部分,它还会相应地设置Session
,Request
,Resposne
等。
因此,您需要调用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
的简写(Request
,Response
等相同),因此您可以设置ControllerContext
:
var controllerB = new ControllerB();
controllerB.ControllerContext = new ControllerContext(this.Request.RequestContext, controllerB);
请参阅MSDN
答案 1 :(得分:1)
这是因为Session
是根据控制器的调用方式而初始化的属性。
您可以使用Session
代替HttpContext.Session
。 HttpContext
指的是当前的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
}