当从一个控制器到另一个控制器调用方法时,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中是空的呢?谢谢你
这是因为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
代替Session
。HttpContext
指当前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
}