2011-09-15 32 views
3

时,我们使用一个BaseController之前,每一个动作执行缓存基本验证信息:ControllerContext是零和BaseController.OnActionExecuting()不叫使用Html.Action

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方法也没有被调用。

+0

还应该注意到我们正在使用MVCContrib – amoss

+0

您是否更新了T4MVC模板? –

+0

是的,这些都是最新的。事实证明,MVCContrib html helper是罪魁祸首。它确实调用了操​​作,但是使用null控制器上下文。我切换到@ Html.Action(“GetNavigation”,“Collaboration”),一切正常。 – amoss

回答

0

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

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

至少排序的回答我的问题:

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

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

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