我们使用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.ControllerContext
和base.User
都是null
。我也尝试了子类化ActionFilterAttribute
,但它的OnActionExecuting方法也没有被调用。
答案 0 :(得分:0)
至少有点回答了我自己的问题:
代
@Html.Action("GetNavigation", "Collaboration")
的
@Html.Action(MVC.Collaboration.GetNavigation())
修复它。 MVCContrib的语法似乎是罪魁祸首,任何人都知道为什么?更好的是,任何人都知道一个解决方法,让我避免那些讨厌的,非重构安全的魔术字符串?
答案 1 :(得分:0)
我知道这是一个老问题,但这是我如何处理这个问题。在我的子控制器中,我创建OnActionExecuting方法并从那里调用基本控制器。
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
}