ControllerContext为null,使用Html.Action时未调用BaseController.OnActionExecuting()

时间:2011-09-15 15:45:30

标签: asp.net-mvc asp.net-mvc-3 html-helper action-filter

我们使用BaseController在每个操作执行之前缓存基本身份验证信息:

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;

        ...
    }
}

我们的子控制器有主页(索引)和部分视图(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);
    }
}

部分视图直接使用Html.Action()

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

似乎它应该有用,但BaseController.OnActionExecuting不会被调用。我甚至无法直接调用它,因为this.ControllerContextbase.User都是null。我也尝试了子类化ActionFilterAttribute,但它的OnActionExecuting方法也没有被调用。

2 个答案:

答案 0 :(得分:0)

至少有点回答了我自己的问题:

@Html.Action("GetNavigation", "Collaboration")

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

修复它。 MVCContrib的语法似乎是罪魁祸首,任何人都知道为什么?更好的是,任何人都知道一个解决方法,让我避免那些讨厌的,非重构安全的魔术字符串?

答案 1 :(得分:0)

我知道这是一个老问题,但这是我如何处理这个问题。在我的子控制器中,我创建OnActionExecuting方法并从那里调用基本控制器。

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