Null ControllerContext в моем собственном контроллере, наследуемом от BaseController

Я построил свой собственный класс Controller, который наследуется от BaseController, Тем не менее ControllerContext в конструкторе "ноль". Где я должен указать ControllerContext?

1 ответ

Решение

ControllerContext свойство не назначено ни одному из базовых конструкторов в иерархии наследования. Контроллер создается фабрикой контроллеров и передается обратно без ControllerContext свойство присваивается.

Используя Reflector, мы можем посмотреть, где происходит назначение:

protected virtual void Initialize(RequestContext requestContext)
{
    this.ControllerContext = new ControllerContext(requestContext, this);
}

Initialize метод вызывается из виртуального вызова метода Execute:

protected virtual void Execute(RequestContext requestContext)
{
    if (requestContext == null)
    {
        throw new ArgumentNullException("requestContext");
    }
    this.VerifyExecuteCalledOnce();
    this.Initialize(requestContext);
    this.ExecuteCore();
}

Это означает самую раннюю точку, в которой вы можете получить доступ к ControllerContext свойство путем переопределения Execute или же Initialize метод (но вызов base.Execute или же base.Initialize первый):

protected override void Execute(RequestContext requestContext)
{
  base.Execute(requestContext);

  // .ControllerContext is available from this point forward.
}

protected override void Initialize(RequestContext requestContext)
{
  base.Initialize(requestContext);

  // .ControllerContext is available from this point forward.
}

Последний (Initialize) - это самая ранняя точка, в которой вы можете использовать свойство ControllerContext, если только вы сами не обрабатывали назначение, что не рекомендуется (поскольку части структуры будут зависеть от того, какое свойство было назначено в то время).

Надеюсь, это поможет.

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