我自定义的控制器继承自BaseController,但是ControllerContext为空。

9

我建立了一个继承自BaseController的控制器类。然而,构造函数中的ControllerContext是“null”。我应该在哪里指定ControllerContext

1个回答

24

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属性的最早时间是通过重写ExecuteInitialize方法(但首先调用base.Executebase.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 属性的绝对最早时间点,除非您自己处理了该赋值,但这不是推荐的方式(因为框架的某些部分将依赖于在此时分配该属性)。

希望这能有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接