我有一个旧应用程序,它有一个ActionResult函数,我希望将其包含在另一个较新的应用程序中。
我发现我可以添加旧控制器作为参考,将控制器实例化为对象,然后相应地调用ActionResult函数,如下所示:
public ActionResult test()
{
OlderApplication.Controllers.PatronController temp = new OlderApplication.Controllers.PatronController();
return temp.Index();
}
我的问题在于temp.Index()内部它引用了Session,它是以null形式而不是具有应该存在的值。我可以通过这种方式提供会话吗?
答案 0 :(得分:1)
在您给出的示例中,您没有两个MVC应用程序 - 您拥有一个共享相同代码库的应用程序。 “应用程序”由网络服务器定义,但我离题了。
temp
内的会话为空的原因是因为您没有正确初始化控制器 - 控制器不是POCO,它们需要初始化。请致电temp.Initialize()
,但您需要自己创建RequestContext
个实例,如下所示:
RequestContext context = new RequestContext( this.Context, this.RouteData );
OlderApplication.Controllers.PatronController oldController = new OlderApplication.Controllers.PatronController();
oldController.Initialize( context );
return oldController.Index();
虽然如果您正在完成此步骤,您也可以将旧控制器连接到区域注册和/或URI路由表中,从而无需编写此代码。
答案 1 :(得分:1)
正如戴指出你没有正确创建控制器。 我建议使用控制器工厂来创建控制器。
var oldController = ControllerBuilder.Current.GetControllerFactory().CreateController(Request.RequestContext, "Patron");