从一个控制器调用方法到另一个控制器时会话为空...MVC

2023-11-24

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


那是因为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);

或者,由于Sessiongetter 实际上是一个简写this.ControllerContext.HttpContext.Session(同样适用于Request, Response等),您可以设置ControllerContext反而:

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

See MSDN

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从一个控制器调用方法到另一个控制器时会话为空...MVC 的相关文章

随机推荐