ControllerContext为null
我有这个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
为null。
如果我将Check方法移动到ControllerA,它可以正常工作。 但我需要这种方法在不同的控制器中。 如何修复我的代码,以便“this.ControllerContext`不会为空?
ControllerContext
为null,因为您是从ControllerA
手动创建ControllerB
实例。
通常, IController
实例由注册的IControllerFactory
创建,通常是System.Web.Mvc.DefaultControllerFactory
。 控制器工厂将new()
实例并正确初始化设置。
正如@DZL所说,让两个控制器子类化BaseController
类通常要好得多, 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()
,但这是一种非常令人费解的做事方式 – 我不推荐它。