ControllerContext имеет значение null
У меня есть контроллер MVC4 (ControllerB
):
public class MyControllerB : Controller
{
public bool Check(string actionName, ControllerBase controllerBase)
{
ControllerContext controllerContext = new ControllerContext(this.ControllerContext.RequestContext, controllerBase);
...
}
}
Я вызываю метод Check ControllerB из "ControllerA", вот так:
bool b = new MyControllerB().Check("Index", this);
я получил Object reference not set to an instance of an object
так как this.ControllerContext
нулевой.
Если я переместить метод проверки в ControllerA, он работает просто отлично. Но мне нужно, чтобы этот метод был в другом контроллере. Как я могу исправить свой код, чтобы ``this.ControllerContext` не было нулевым?
1 ответ
ControllerContext
является нулевым, потому что вы вручную создаете ControllerB
экземпляр из ControllerA
,
Обычно, IController
экземпляры создаются зарегистрированными IControllerFactory
как правило, System.Web.Mvc.DefaultControllerFactory
, Контроллер фабрики будет new()
экземпляр и инициализировать настройки правильно.
Как говорит @DZL, обычно гораздо лучше иметь оба подкласса контроллеров BaseController
класс, который может иметь общую инициализацию и общие свойства и методы.
Я не понимаю бизнес-логику того, что вы пытаетесь сделать, но вот пример кода использования базового класса из двух контроллеров:
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()
, но это действительно запутанный способ делать вещи - я бы не рекомендовал это.