我有这个 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);
I get Object reference not set to an instance of an object
因为this.ControllerContext
一片空白。
如果我将 Check 方法移至 ControllerA,它就可以正常工作。但我需要这个方法位于不同的控制器中。如何修复我的代码以使“this.ControllerContext”不为空?
The ControllerContext
为空,因为您正在手动创建ControllerB
实例来自ControllerA
.
通常情况下,IController
实例由注册者创建IControllerFactory
, 通常System.Web.Mvc.DefaultControllerFactory
。控制器工厂将new()
实例并正确初始化设置。
正如 @DZL 所说,通常最好让两个控制器都子类为 aBaseController
类,可以具有共享初始化以及共享属性和方法。
我不明白你想要做什么的业务逻辑,但这里有一个使用两个控制器的基类的代码示例:
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()
,但这是一种非常复杂的做事方式 - 我不会推荐它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)