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(), но это действительно запутанный способ делать вещи - я бы не рекомендовал это.

Другие вопросы по тегам