在控制器的构造函数中访问HttpContext.Request

我正在关注微软的ASP.NET MVC教程 :

我的代码略有不同,我试图访问控制器的构造函数中的HttpContext.Request.IsAuthenticated

 namespace SCE.Controllers.Application { public abstract class ApplicationController : Controller { public ApplicationController() { bool usuario = HttpContext.Request.IsAuthenticated; } } } 

问题是HttpContext始终为空。

有针对这个的解决方法吗?

控制器在调用Index操作之前显着实例化,并且在构buildHttpContext的时刻确实不可用。 在控制器方法中引用它有什么问题Index

而不是把你的HttpContext.Request.IsAuthenticated在控制器级别上,你应该把它放在控制器基类中,这个控制器类将被OnActionExecuting()方法的覆盖方法inheritance。

在你的Controller基地,你应该有

 public class BaseController : Controller { protected override void OnActionExecuting(ActionExecutingContext ctx) { base.OnActionExecuting(ctx); ViewData["IsAuthenticated"] = HttpContext.Request.IsAuthenticated; } } 

所有的控制器都应该inheritanceBaseController类

 public class ApplicationController : BaseController 

现在你应该在你的母版页中获得ViewData["IsAuthenticated"]

编辑

通过你给出的链接,并且关于你所做的事情,你的ApplicationController是一个页面控制器,而不是一个基本控制器。 在这个例子中, ApplicationController是一个由HomeControllerinheritance的基本控制器,但是你所做的是将Action方法放在你的基本控制器中,这就是ApplicationController所以当你调用任何页面时你的Action Index方法将不会被调用索引页)不是来自ApplicationController。

我build议你使用:

  System.Web.HttpContext.Current.Request 

只要记住System.Web.HttpContext.Current是线程静态的,但如果你不使用额外的线程解决scheme的工作。

这个问题的解决scheme是通过传递RequestContext对象来创build一个重载的Initialize方法。

 public class ChartsController : Controller { bool isAuthed = false; protected override void Initialize(System.Web.Routing.RequestContext requestContext) { base.Initialize(requestContext); if (requestContext.HttpContext.User.Identity.IsAuthenticated) { isAuthed =true; } } }