控制器实例化将在授权发生之前发生。即使您的 MVC 应用程序调用RenderAction()
多次并且您最终创建了五个不同的控制器,这五个控制器将在任何OnAuthorization发生之前创建。
处理这些情况的最佳方法是使用动作过滤器。Authorize 属性会提前触发,可能很适合您的情况。
首先,让我们创建一个AuthorizationFilter。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class MyClassAuthorizationAttribute : Attribute, IAuthorizationFilter
{
public void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.User.Identity.IsAuthenticated)
{
filterContext.Controller.ViewData["MyClassInstance"] = new MyClass();
}
}
}
现在让我们更新我们的控制器
[MyClassAuthorization]
public class BaseController : Controller
{
protected MyClass Foo
{
get { return (MyClass)ViewData["MyClassInstance"]; }
}
}