Search code examples
asp.net-mvcasp.net-mvc-3html-helperaction-filter

ControllerContext is null and BaseController.OnActionExecuting() not called when using Html.Action


We use a BaseController to cache basic authentication information before every action executes:

public abstract class BaseController : Controller
{
    protected bool IsLoggedIn { get; set; }
    protected string Username { get; set; }
    ...

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var identity = base.User.Identity;
        this.IsLoggedIn = identity.IsAuthenticated;
        this.Username = identity.Name;

        ...
    }
}

And our child controller has a actions for the main page (Index) and a partial view (GetNavigation):

[Authorize]
public partial class CollaborationController : BaseController
{
    [HttpGet]
    public virtual ViewResult Index()
    {
        var viewModel = this.MakeViewModel<FullPageViewModel>();
        return this.View(MVC.Collaboration.Views.Index, viewModel);
    }

    [HttpGet]
    public virtual PartialViewResult GetNavigation()
    {
        var viewModel = NavigationViewModel.Make(this.User);
        return this.PartialView(MVC.Collaboration.Views.Navigation, viewModel);
    }
}

And the partial view is rendered directly with Html.Action():

@Html.Action(MVC.Collaboration.GetNavigation())

Seems like it should work, but BaseController.OnActionExecuting does not get called. And I can't even call it directly because this.ControllerContext and base.User are both null. I also tried subclassing ActionFilterAttribute, but its OnActionExecuting method doesn't get called, either.


Solution

  • I know this is an old question but here is how I handle this. In my child controller I create the OnActionExecuting method and call the base controller from there.

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
         base.OnActionExecuting(filterContext);
    }