【发布时间】:2017-07-26 17:21:12
【问题描述】:
我有一个使用多控制器继承的应用程序。我在继承的多个级别中覆盖了Initialize(RequestContext requestContext),但是每次我覆盖Initialize 方法时,我都会调用base.Initialize(requestContext);
[Authorize]
public class FirstBaseController: Controller
{
protected override void Initialize(RequestContext requestContext)
{
base.Initialize(requestContext);
// Set few custom global things
}
}
public class SecondBaseController: FirstBaseController
{
protected override void Initialize(RequestContext requestContext)
{
base.Initialize(requestContext);
// At this point, I am expecting that the `User` object is already set by identity
//check the claims value here.
}
}
但是,如果我尝试从 Initialize 方法内部访问 User 对象,我发现它尚未设置!
框架在什么时间点设置User 对象?我可以覆盖操作方法之前的哪个方法已经设置了User 对象?
我不想在这里使用操作过滤器,因为我希望在每个请求上都执行此逻辑。
【问题讨论】:
-
我很困惑。为什么您认为不是对每个请求都执行操作过滤器?
-
@ErikFunkenbusch 我不想手动为每个方法添加属性,除非有办法将它添加到所有方法中。 + 甚至可以从操作过滤器中访问
User对象吗? -
您可以通过
HttpContext.Current.User从操作过滤器访问用户对象。如果您查看实际的 MVC 源代码,您会看到控制器上的 User 属性只是从当前 http 上下文返回 User。 -
另外,关于动作过滤器 - 您可以将它们应用到控制器,它们将应用于该控制器(或基类控制器,它们将应用于所有控制器上的所有方法)派生自该基类)
-
有一种方法可以将其添加到所有方法中。您使用全局过滤器。见weblogs.asp.net/gunnarpeipman/…
标签: c# asp.net asp.net-mvc asp.net-mvc-5 controller