我的ASP.NET MVC4网站上有一个基本Controller,它的构造函数很简单:
public class BaseController : Controller
{
protected MyClass Foo { get; set; }
public BaseController()
{
if (User.Identity.IsAuthenticated))
{
Foo = new MyClass();
}
}
}
但是我无法在此处访问User
。它是null
。但是对于我继承的控制器,没关系。
由于
答案 0 :(得分:9)
控制器实例化将在授权发生之前进行。即使您的MVC应用程序多次调用RenderAction()
并且您最终创建了五个不同的控制器,也会在任何OnAuthorization之前创建这五个控制器。
处理这些情况的最佳方法是使用Action Filters。 Authorize Attribute提前解雇,可能适合您的情况。
首先,让我们创建一个 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"]; }
}
}
答案 1 :(得分:4)
在这种情况下,我会override Controller Initialize method:
Values