我有这个MVC4控制器(ControllerB
):
public class MyControllerB : Controller
{
public bool Check(string actionName, ControllerBase controllerBase)
{
ControllerContext controllerContext = new ControllerContext(this.ControllerContext.RequestContext, controllerBase);
...
}
}
我从“ControllerA”调用ControllerB的Check方法,如下所示:
bool b = new MyControllerB().Check("Index", this);
我得到Object reference not set to an instance of an object
,因为this.ControllerContext
为空。
如果我将Check方法移动到ControllerA,它可以正常工作。但我需要这种方法在不同的控制器中。如何修复我的代码,以便``this.ControllerContext`不会为空?
答案 0 :(得分:5)
ControllerContext
为空,因为您是从ControllerB
手动创建ControllerA
实例。
通常,IController
个实例由注册的IControllerFactory
创建,通常为System.Web.Mvc.DefaultControllerFactory
。控制器工厂将new()
实例并正确初始化设置。
正如@DZL所说,让两个控制器都为BaseController
类创建子类通常要好得多,它可以具有共享初始化和共享属性和方法。
我不了解您尝试做的业务逻辑,但这是使用2个控制器的基类的代码示例:
namespace MyNamespace.Controllers
{
public class MyControllerBase : Controller
{
public bool Check(string actionName, ControllerBase controllerBase)
{
ControllerContext controllerContext = new ControllerContext(this.ControllerContext.RequestContext, controllerBase);
return false;
}
}
public class MyControllerA : MyControllerBase
{
ActionResult Index()
{
bool b = base.Check("Index", this);
return View();
}
}
public class MyControllerB : MyControllerBase
{
ActionResult Index()
{
bool b = base.Check("Index", this);
return View();
}
}
}
如果你真的想要完全按照自己的要求行事,你必须拨打IControllerFactory.CreateController(requestContext, controllerName)
而不是new ControllerB()
,但这是一种非常复杂的做事方式 - 我不建议它。